面向对象的三大特性最后一个:多态
1.方法重载
-->同一个方法,不同的行为,参数不同这一特性称之为方法重载,构造函数就是方法重载
-->方法重载的特点:
1.方法名必须相同
2.参数列表不可以相同
3.如果参数列表相同,那么判断方法重载时就要看参数的类型或者参数的顺序
4.函数返回值类型不构成判断方法的依据
5.必须是同一个类中同一个方法的不同实现
2.方法重写
-->方法重写的特点:
1.必须是父子关系
2.需要被重写的方法前面要被声明为虚方法
3.子类重写父类的虚方法要使用override关键字
4.一般情况下virtual与override需要成对出现
5.虚方法可能会被重写(就是子类可以用override也可以不用)
6.子类重写的父类方法,那么父类的方法一定是虚方法
-->方法重写的使用场景
1.多个子类对同一个行为表现出不同的状态时,此时应用重写
2.虚方法实际上功能已经实现,但是又不是实现的很好,通过重写去完善功能
-->方法重写需要注意的地方;
1.子类不能重写父类用sealed修饰的方法
2.子类不能重写父类用static修饰的方法
3.如果父类中有abstract修饰的方法时,子类必须重写
3.里氏替换原则
-->LSP:原则上来说子类对象可以赋值给父类对象,也可以说子类替换父类,并且能够出现任何父类出现的地方,反过来说父类对象不能直接替换子类对象,
这种特性称为里氏替换原则:
1.子类可以隐式转换为父类
2.父类必须强转子类(强转只是改变类型,不能改变指针所指的内存)Person p=new LaoWang(); LaoWang p1=(LaoWang)p;
-->is和as
as关键字的含义是转换,但是一旦转换失败后,系统会默认给一个NUll值,程序不会报错
A as B 为真给B的类型,为假给null
is:询问的意思
A is B is作为判断A是不是B类型或者A是不是B类型的子类
在调用一个对象的方法时,会检查这个对象a2 的类型,首先找到堆中的类型对象指针,通过指针 找到对象a2,查看其是否有该方法,如果没有,则通过类型对象的类型对象指针向上 查找,直到找到该方法为止,然后检查该方法是否为虚方法.如果非虚方法直接调用,如果该方法为虚方法,即有 virtual修饰的方法,则根据变量a2去找对象的实例,查找该方法是否被重写过,如果有,执行.没有则继续向上查找
抽象类
关键字--abstract class xxxx:定义一个抽象类
抽象类的作用:限制子类行为
抽象类的特点:
1.如果抽象类中含有抽象方法,那么方法不可以有实现体,仅仅是个方法声明;
2.抽象类中的抽象方法,子类在继承该抽象类时,必须重写该抽象方法
3.抽象方法不能用private修饰
4.抽象类中不一定含有抽象方法,但是含有抽象方法的类一定是抽象类
5.抽象类不能new,可以被实例化(利用里氏替换原则)
6.抽象类中同样可以包含静态成员
7.virtual不能跟abstract放在一起使用
8.abstract只能修饰类或者方法.
接口:接口就是公共契约,
在c#中使用关键字Interface来声明接口
接口和类也是同级关系,
接口的作用:
1.接口解决了c#中不能多重继承的问题
2.接口和抽象类一样,都是限制了子类的行为
接口是最纯洁的抽象类
接口的命名规范:定义接口,应该以大写的I+功能
接口的特点:
1.接口不能包含字段
2.接口中不能带有修饰符
3.接口中只能有方法的声明不能有实现部分
4.接口不能new实例化,可以被实例化(利用里氏替换原则)
5.接口里面所有的成员都是公开的
6.接口可以声明属性,
7.接口中的方法声明,不需要加abstract,因为系统会为我们接口中方法声明加上abstract,但是我们不能显示的写出来
8.接口中可以声明索引器以及委托事件的
9.子类在继承接口时,不需要在使用override关键字