多态:为了程序的可扩展性,开放封闭原则 (对修改封闭,对扩展开放)
多态就是指不同对象收到相同消息时,会产生不同的行为,同一个类在不同的场合下表现出不同的行为特征。
多态的作用:把不同的子类对象都当做父类来看,可以屏蔽不同子类对象之间的差异性,写出通用的代码,做出通用的编程,已以适应需求的不断变化。
实现多态的方法:
1)、虚方法 是有意义的 调用子类重写的方法之前会调用 父类的虚方法。
步骤:1、将父类的方法标记为虚方法 ,使用关键字 virtual,这个函数可以被子类重新写一个遍。子类加一个override
2)、抽象类
当父类中的方法不知道如何去实现的时候,可以考虑将父类写成抽象类,将方法写成抽象方法。
父类和父类的方法abstaact 子类的方法重写父类的抽象方法 抽象方法没有方法体 有大括号就叫做有方法体,大括号没有内容叫空实现。
父类的抽象方法存在的意义 就是在于让子类的方法重写。
3)、接口
不能实例化的 接口 抽象类 静态类
什么时候用抽象类 多个类中 如果能抽象出一个父类 父类中有子类共有的方法并且不知道如何写这个方法
什么时候用虚方法 多个类中 如果能抽象出一个父类 父类中有子类共有的方法并且知道如何写这个方法 还要实例化父类对象
什么时候用接口 多个类中 找不出一个父类 并且多个类有共同的方法或能力 比如 鸟跟飞机
里氏替换原则:
1)父类引用指向子类对象Person p = new Chinese() (隐式类型转换)
2)父类对象不能够替换子类对象 Chinese ch = (Chinese) new Person() 这是错误的
is-a可以用来验证继承关系是否合理 (can do验证实现接口是否合理)
if(obj is 类型A) //obj是父类类型对象,类型A 是子类对象
关键字 as(类型转换)(通常类型转换之前需要通过is来判断一下类型)
如果转换成功则将结果赋值给cn变量,
//如果转换失败也不报错,会将null值赋值给cn;
//最好在转换后,加一个cn是否为null的验证。
Chinese cn = perasChinese;
if (cn!=null)
{
//做一些事情
}
//如果转换失败会报错!!!
Chinese cn1 = ( Chinese )per;
class Program
{
static void Main(string[] args)
{
Person p = new American(); //new Chinese();
//Chinese cn = (Chinese)p;
Person p = new ShiJiaZhuangRen();
QinHuangDaoRen qhd = (QinHuangDaoRen)p;
Console.WriteLine("ok");
Console.ReadKey();
Person p = new ShiJiaZhuangRen();
if (p is Chinese)
{
//类型转换,最好在转换前做判断。否则如果转换失败则报异常
Chinese qhd = (Chinese)p;
}
//另外一种类型转换,以下使用as的这种数据类型转换如果转换成功则把转换后的结果赋值给c变量,如果转换失败则给c变量赋值一个null值。即便转换失败也不会报异常。
American c = p as American;//推荐使用这种方式。
Console.WriteLine("ok");
Console.ReadKey();
}
}
class Person
{
}
class Chinese : Person
{
}
class American : Person
{
}
class HeBeiRen : Chinese
{
}
class ShiJiaZhuangRen : HeBeiRen
{
}
class QinHuangDaoRen : HeBeiRen
{
}
class JiaLiFuNiYaRen : American
{
}