继承,多态,封装
在C#中,为了能够合理描述自然界的规律,面向对象的编程引入了继承的概念,是面向对象编程中最重要的概念之一,定义了如何根据现有的类创建新类的过程.
继承:一个类派生出来的子类具有这个类所有的公共属性和方法。
父类派生子类,子类继承父类。
语法-- 子类:父类
子类和父类
被继承的类称为父类或基类,继承其他类的类称为子类或派生类,子类不仅具有自己的独有的成员,还有父类的成员。
Is a 的应用
在两个类中建立继承关系必须符合is a 的关系(例:小型卡车 is a 卡车,卡车is a 汽车,小型卡车is a汽车)
里氏替换原则:子类可以替换父类,但父类不可以替换子类对象。
只有当子类可以替换父类时,软件功能不受影响,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。
Is 和 as操作符的使用
Is 操作符用于检查对象和制定的类型是否兼容。
As 操作符主要用于两个对象之间的类型转换
继承的特性
继承有传递性(子类能派生子类)和单根性(一个子类不能同时继承多个父类)
Base关键字和protected修饰符
base:表示父类,用于调用父类里的成员。
Protected:修饰父类成员,只允许子类调用和类的本身内部访问,不允许其他非子类访问。
修饰符的区别:
Public:任何类都可以访问。
Private:任何类都不可以访问。
Protected:只能由类的本身该类的子类内部访问,其他任何类不可以访问
子类构造函数:
任何子类都继承父类的公共无参构造函数,父类的其他构造函数不会被继承,只能在子类中声明相同签名的构造函数并用base显示调用。
子类的构造函数肯定会调用父类的构造函数,先执行父类中的构造函数在执行子类中的构造函数。
隐式调用父类中的构造函数:
子类(没有指明的情况下)调用父类中系统默认的一个无参构造函数。
显示掉用父类中的构造函数
在子类指明的情况下用base关键字调用父类的某一个构造函数,实现属性的初始化,然后在子类本身的构造函数中完成对子类特有的属性初始化。如果子类没有指明调用父类里手动创建的哪个构造函数时系统就会调用父类中手动创建的无参的构造函数,若是没有系统将会报错。
Public SE(string name); = Public SE(string name):base();
注:用base调用父类构造函数时,只能传递参数。
多态
多态:两个或多个属于不同类的对象,对于同一个消息(方法调用)作出不同响应的方式。
多态是建立在继承的基础上的,没有继承就没有多态。
实现多态
以父类类型作为参数:可以接受他的子类类型,程序在运行中自动判断实际参数属于哪种子类,调用子类的方法从而实现多态。
我们通过虚方法和抽象方法在继承的基础上实现多态(通过重写父类的方法,完成自己的方法)。
虚方法:实现方法重写。通过关键字Virtual来定义一个虚方法(父类中),用Override修饰来重写这个虚方法(子类中)。
语法:访问修饰符 virtual 返回值类型 方法名()
{
//方法体
}
用虚方法 实现多态:
1.子类重写父类的虚方法
两种方式:1.创建父类变量用子类对象实例化这个父类变量
2.把父类类型作为参数,它的子类对象作为参数传入
2.运行时,根据实际创建的对象决定执行哪个方法
抽象方法: 是一个没有实现的方法,这些方法只能定义,通过在定义方法时加上关键字abstract可以声明一个抽象方法(父类中),用Override来重写这个抽象方法(重写)。
语法:访问修饰符 sbstract返回值类型 方法名();
注:抽象方法中没有方法体。
抽象方法的应用:定义抽象方法必须在非抽象的子类中去实现,抽象方法必须定义在抽象类中。
抽象类:用sbstract修饰的类都是抽象类。抽象类是抽象的概念,抽象类提供抽象方法要求继承他的子类去实现,通过这些抽象方法来约束子类的行为,有抽象的方法的类必然是抽象类,抽象类中不一定只能有抽象方法。
抽象类不能被实例化,也不能是密封和静态的
抽象方法和虚方法都是通过override重写父类的方法来实现多态。
注:重写父类的语法:方法名、参数列表,返回值一样
(方法重载是在一个类中完成,方法名相同,参数个数和参数类型不同,并且和返回值无关)
二者之间的区别:
抽象方法:
用abstract关键字修饰,
没有方法体,
必须被override重写,
只能在抽象类中写。
虚方法:
用virtaul关键字修饰有方法体
可以被override重写,
也可以不被override重写
面向对象思想
封装:保证对象自身数据的完整性和安全性。
继承:建立类之间的关系,实现代码复用,方便系统扩展。
多态:相同的方法调用可实现不同的实现方式。