第七周总结
多态就是指同一操作作用于不同的对象,会产生不同的结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
多态性可以是静态的或动态的。
多态性往往表现为“一个接口,多个功能”。
静态多态性
在编译时,函数和对象的连接机制被称为早期绑定,也被称为静态绑定。C#提供了两种技术来实现静态多态性。
分别为:
函数重载
运算符重载
动态多态性
C#允许使用关键字abstract创建抽象类,用于提供接口的部分类的实现。当一个派生类继承自该抽象类时,实现即完成。抽象类包含抽象方法,抽象方法可被派生类实现。派生类具有更重要的功能。
关于抽象类的一些规则:
不能创建一个抽象类的实例 不能在一个抽象类的外部声明一个抽象方法 抽象类不能被声明为sealed。
在继承关系中,子类会自动继承父类中的方法,但有时父类的方法不能满足子类的需求,那么可以对父类的方法进行重写。当重写父类的方法,要求子类的方法名、参数类型和参数个数必须与父类方法相同,而且父类方法必须使用virtual关键字修饰,子类方法必须使用override关键字修饰。
被virtual关键字修饰的方法称作虚方法。
override关键字:
重写父类中的virtual修饰的方法,实现多态。
如果父类中的方法在子类中并不适用,那么子类需要自主更改继承的方法或是属性,父类中加了virtual关键字的方法才可以被子类重写,子类重写父类的方法使用的是override关键字
定义关键字:虚方法virtual 重写override
当实例方法声明包含virtual修饰符时,称该方法为虚方法。不存在virtual修饰符时,称该方法为非虚方法。
对于非虚的方法,无论被其所在类的实例调用,还是被这个类的派生类的实例调用,方法的执行方式不变。而对于虚方法,它的执行方式可以被派生类改变,这种改变是通过方法的重载来实现的。
注意:子类重写父类方法时,不能使用比父类中被重写的方法更严格的访问权限,如父类方法的访问修饰符是public,子类的方法就不能使用private修饰。
隐藏和重写方法的区别: * 如果方法是被隐藏的, 则根据引用类型来调用方法; 如果方法是被重写的, 则根据对象的实际类型来调用方法.
* 如果想重写方法,需要对方法用virtual和override修饰; 如果想隐藏方法, 需要在子类中的方法用new修饰. (显然这个new和在创造对象时所用的new含义不一样)
* 如果子类和基类中含有同名(一模一样)的方法(方法体不一定一样, 只是函数头一模一样), 默认情况下是隐藏而不是被重写.
重载和重写的区别:* 重载的条件:
1.必须在同一个类中2.方法名必须相同3.参数列表不能相同。
*重写的条件:
1. 在不同的类中
2. 发生方法重写的两个方法返回值,方法名,参数列表必须完全一致
3. 子类抛出的异常不能超过父类相应的方法抛出的异常
4. 子类方法的访问级别不能低于父类相应方法的访问级别(public,package,protected, private)
5.方法体不同
base关键字:当子类重写父类的方法后,子类对象将无法直接访问父类被重写的方法。C#中提供了一个base关键字专门用于在子类中访问父类的成员,例如访问父类的字段、方法和构造方法等。接下来分两种情况来学习一下base关键字的具体用法。