1.虚方法必须有实现部分,并且为派生类提供了重写该方法的选项.
public virtual void Say(); //错误
2.抽象方法没有实现部分,并且抽象方法的派生是一种强迫性的.
继承抽象类就必须实现抽象方法,这与我们virtual是不同的.
3.抽象方法只能在抽象类中进行声明.抽象方法必须在派生类重写.
含有抽象的方法必然是抽象类.也就是说必须强制声明为abstract,
系统不会自动为我们添加.
4.抽象方法必须在派生类重写,这一点和interface类似,虚方法不必.
虚方法和抽象方法的联系:
1.无论是虚方法或者抽象方法,重写必须使用override关键字
抽象类:
在程序中使用关键字abstract
如果说正常类是一个完整的类的话,抽象类实际上是一个不完整的类.
抽象类的特点:
1.如果类中存在抽象方法,那么该方法不可以有实现部分.只能是方法声明.
2.含有抽象方法的类一定是抽象类.
3.抽象类不一定含有抽象方法.
4.如果子类的父类为抽象类并且含有抽象方法的话,子类必须实现重写该抽象方法.
5.virtual和abstract不能使用private修饰符,要使用public修饰符.
6.virtual不能和abstract放在一起用.
7.抽象类不能被实例化.
8.抽象类可以包含静态成员.
抽象类的作用:父类约束子类行为.
接口:接口就是公共契约.
接口的关键字:interface
接口和类属于同级关系,都属于c#中的编程单位.
接口也被称作纯洁的抽象类
接口特点:
1.不能有字段
2.接口内不能有修饰符
3.接口中不能有方法体(方法实现)
4.接口同样不可以被直接实例化
5.接口里面成员总是公共的
6.接口中可以有属性,但是不能有修饰符
7.接口中可以有索引器/事件声明
8.接口中声明的方法,子类实现的时候虽然也用override关键字,但是记住不属于重写.这里不能把
override显示的声明出来.
开发准则:尽量多用接口.
能用接口的不用抽象类,能用抽象类不用虚方法.
动态多态性.
LSP:
*原则上来讲子类对象介意赋给父类对象,也可以说子类替换父类,并且出在父类能够出现
的任何地方.
反过来说,父类对象是不能替换子类对象的,这种特性称为李氏替换原则:
1.子类可以隐式的转换为父类
2.父类必须强转子类
is && as
is :相当于判断. A is B A是不是B或者A是不是B的子类?
as :先判断,在转换.
(它比传统的强制装换要相对来说安全一点,因为传统的强制转换
*一旦转换失败的话程序就崩溃了.那使用as关键字可以保证,程序一样执行,只不过
*转换不成功,就赋一个空类型.)
����xy�%�
网友评论