面向对象高级5.3

本周我们围绕多态来进行的学习,所谓多态就是指同一操作作用于不同的对象,会产生不同的结果。多态可以使程序变得更加灵活,从而有效提高程序的可扩展性和可维护性。实现多态的方式有很多种,重写就是其中的一种。其中有一个知识点:动态绑定。所谓动态绑定就是把派生类的对象,地址赋给基类的引用变量。

* 多态存在的三个必要条件:

1.多态以继承为基础--继承。

2.按照契约形成另一种形态(特殊性)--重写。

3.父类引用指向子类对象--使用时“动态绑定”。

* 多态的内在实现机制:

1.编译器为每一个含virtual关键字的方法构建--Vtrl--虚函数表--存储每个虚方法的首址。

2.派生类如果改写了(override)方法,则派生类的Vtrl--虚函数表--的虚方法首址将改变,指向新的已经被override的新方法。

3.动态绑定时,基类的对象引用它绑定的是那个派生类的对象,那么这个基类引用对象就将引用那个派生类的override方法。

重写父类方法时,要求子类的方法名,参数类型和参数个数必须与父类方法相同,而且父类方法必须使用virtual关键字修饰,子类方法必须使用override关键字修饰,被virtual关键字修饰的方法称为虚方法。

base关键字是基类的引用,它专门用于在子类中访问父类的成员。它不但可以调用父类的字段和方法,还可以调用父类的构造方法。在c#中可以使用一个父类类型的变量来引用一个子类类型的对象,即将子类对象当作父类类型来使用,这就是所谓的里氏转换原则。这也说明了在继承关系中当子类对象赋值给父类变量的情况下,父类变量也可以通过强制转换指向子类变量。与其相关的还有is和as关键字,它们都可以用来判断父类对象是否指向子类,as关键字除了判断以外,还有直接转换功能。如果判断成功就直接进行类型转换,如果判断失败就返回null。在c#中还提供了一个Object类,它是所有类的父类,即每个类都直接或间接继承自该类。

原文地址:https://www.cnblogs.com/mwt63/p/10707163.html