继承(inheritance)
继承的优点:提高软件模块的可复用性和可扩充性。
继承
- 在 C# 中,类可以继承自另一个类
- 衍生的类(子类)继承父类的方法和数据成员
- 子类继承父类,父类派生子类父类又叫基类子类又叫派生类
- 继承是面向对象中一个非常重要的特性,在有继承关系的两个类中,子类不仅具有自己都有的成员,还具有父类的成员。
语法
class 子类 : 父类
{ ……}
base关键字和protected修饰符
this:表示当前实例,通过他可以访问本身的成员。
base:表示父类,可以用于访问父类的成员
private:私有的任何类无法访问
public:共有的任何类都可以访问
protected:允许被子类访问,不允许非子类访问。
三种访问修饰符的访问程度:private>protected>public
子类构造函数、
隐用隐式调用构造函数
子类继承父类,那么子类对象在创建的过程中父类发生什么?
- 子类对象会自动调用父类的无参构造函数,经过单步调试返现,创建子类对象时首先调用父类的构造函数,然后才会调用子类本身的构造函数。由于没有指明要调用父类的构造函数,所以系统隐式的调用父类的无参构造函数。
显示调用父类构造函数
- base关键字调用父类的构造函数,只要在子类的构造函数后添加base(参数列表),就可以指定该子类的构造函数调用父类的哪一个构造函数。这样便可以实现 继承属性的初始化,然后在子类本身的构造函数中,完成对子类特有属性初始化。
常见错误
- base关键字调用父类的时候,只能传递参数,无需再次指定参数的数据类型。
- 同时注意,这些 参数的变量名必须与父类的构造函数中的参数名一致,如果不一致机会出现错误。
- 如果父类没有无参的构造函数子类构造函数必须指明调用父类哪个构造函数
继承的特性
- 继承的传递性
- 只要跟父类有继承关系,就可以使用父类的属性和方法
- 继承的单跟性
- 一个子类只有一个父类
- sealed关键字
- 用他修饰的类不能被继承,我们常称这种类为密封类,string类就是密封类。
is a 的应用
is 关键字用来判断对象是否属于给定的类型,属于返回true,否则返回false。
继承的价值
- 继承模拟了现实世界的关系,OOP中强调一切皆对象,这符合我们面向对象编程的思考方向。
- 继承实现了代码的重用性,合理的使用继承,会使代码更加简洁。
- 继承使程序的结构清晰,子类和父类的层次结构清晰,最终的目的是使子类只关子类的相关的行为和状态,无需关注父类的行为和状态。
多态(polymorphism)
多态:指同一操作,用于不同对象,可以有不同的解释,产生不同的执行的效果。
方法重载也是实现多态性的一种方式。只不过重载的方法都在同一个类中,而用虚方法实现多态的方法分散在有继承关系的多个类中
虚方法的语法(virtual )
访问修饰符 virtual 返回类型 方法名()
{
//方法体
}
方法的重写(override )
访问修饰符 override 返回类型 方法名()
{
//方法体
}
实现多态
- 实现方法的重写
在父类中定义的方法,用virtual关键字来定义为虚方法
在子类中定义自己的方法,用override关键字来修饰,实现对父类的方法的重写
- 注意
- 父类中定义的虚方法并非必须被子类重写。在父类中可给出虚方法的默认实现。如果子类不重写父类的虚方法,依然执行父类的默认实现;反之,则执行子类重写后的方法
- 定义父类变量,创建子类对象。根据实际创建的对象类型,决定执行哪个方法。呈现多态性!
重写的步骤
public class Employee
{
public virtual string SayHi()
{
string message = string.Format("大家好!");
return message;
}
}
public class SE:Employee
{
public override string SayHi() {……}
}
方法名、参数列表、返回值一样,提供不同的实现
总结
- 继承必须符合is a的关系,被继承的类成为父类或者基类,继承其他类的类成为派生类。
- 继承很好的解决了代码的复用问题
- 子类继承父类的成员,并且可以拥有自己特有的成员。
- protected访问修饰符允许被子类访问,而不允许被非子类访问
- base关键字可以调用父类的属性,方法,构造函数
- 继承具有传递性
- C#中的继承具有单跟性,一个类不能同时继承多个父类
- 在子类中,如果不用base关键字显示调用父类的构造函数,将隐式调用父类默认的构造函数
- 如果重载的构造函数有一个没有使用base关键字类指明调用父类的哪一个构造函数,父类必须提供一个默认的构造函数
- 多态按字面意思就是"多种形态",指同一操作不同的对象时,可以有不同的解释,产生不同的执行效果
- 可以用虚方法是实现多态