1、 多态的作用:
把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
2、 里氏替换原则:
(1)当需要一个父类类型对象的时候,可以给一个子类类型的对象;反之,不行。
(2)把子类类型赋值给父类类型,发生了隐式类型转换;把父类类型变量赋值给子类类型,需要显式类型转换。前提是如果这个父类类型变量p中,指向的确实是一个子类对象,则可以显式类型转换,如果p指向的不是Chinese,则显式转换会报异常。
Person p = new Chinese ();
Chinese cn = (Chinese) p;
(3)比较两种显式转换方法:
为了避免显式转换报异常,可以提前判断类型。例:
if(p is Chinese)
{
Chinese cn = (Chinese) p;
}
显式类型转换最好用as转换,转换失败不报异常,只返回null。例:
Chinese cn = p asChinese;
(4)类型转换时,验证当前类型是否为某个类型,调用其父类判断。其中GetType()通过反射验证类型。
3、 通过抽象方法实现多态
(1) 抽象成员不能有任何实现:抽象方法不能有任何方法体
(2) 抽象成员必须在抽象类中
(3) 抽象类不能实例化
(4) 父类中的抽象成员,子类继承后必须重写(除非子类也是抽象类)
(5) 抽象类可以包含实例成员
(6) 抽象类有构造函数
(7) 抽象成员不能是private
(8) 可以有抽象方法、抽象属性、抽象事件、抽象索引器
如果父类需要实例化,用虚方法;如果父类不需要实例化,用抽象方法。
4、 new隐藏、截断(不常用)
在子类中写了一个全新的方法SayHi,同时隐藏了从父类中继承下来的SayHi
5、 接口:(小钥匙表示)
(1) 接口中只能包含方法(方法、属性、索引器、事件归根到底都是方法)
(2) 接口中的方法也不能有任何实现(就像抽象方法一样,直接加一个分号)
(3) 接口中的成员不能有任何访问修饰符(哪怕是public),默认是public
(4) 接口不能被实例化
(5) 实现接口的类,必须实现接口所有的成员
为什么用接口?
1、 类不能多继承,所以在某些情况下,只能用接口来代替
2、 接口的主要目的就是为了实现多态
3、 当一个类同时继承了某个类,并且实现了某些接口,必须将继承的类写在前面
4、 当多个类型都具有某个或某几个功能,但它们不属于共同类型,就不能用抽象类。这时为了实现多态,把共有方法提到一个接口中,这多个类实现该接口
建议:不要在一个接口中写过多的方法,避免照成接口污染
6、 简单工厂模式:
private JiSuan GetJiSuanObj(string p)
{
JiSuanjs = null;
switch(p)
{
case “+”:
js = new JiaFa();
break;
case “-”:
js = new JianFa();
break;
}
return js;
}
快捷键:
cw是Console.WriteLine()的快捷键
智能提示完成:shift+alt+F10