C#:里氏替换

前言:前阵子写了一篇有关里氏替换的博客,不过后来不小心误删了...不过也好,自己之前的知识理解不够透彻,特此重写一篇。

里式转化:子类型必须能替换掉它们的父类型。

在C#中与继承相理解:建立一个抽象的父类,而父类中没有具体的方法体,所以要通过具体的子类替换掉父类来实现功能。

延伸理解:儿子终有一天要变成父亲来继承父业。在这里儿子指子类,父亲指父类,继承父业就指代实现功能。

下面进入小杨老师的例子讲解:

注:该例子中,使用Teacher、Student为子类,它们分别有SayHi()与SayHello()方法;而Person为父类,有Say()方法。

1.不可替换的情况

1.1 父类对象不可隐式替换掉子类

Person p2 = new Person();
Teacher t2 = new Teacher();
t2 = p2;

简单来讲就是Teacher t2 = new Person();系统会报错

1.2 父类对象不能强制替换子类

Person p3 = new Person();
Teacher t3 = new Teacher();
t3 = (Teacher)p3;

强制转化后,编译过程不报错了,但在运行时依旧会报错。看来父类强行替换子类这条道路是行不通的。

1.3 子类不可替换另一子类:new的是子类却要替换另一个子类

Person p5 = new Teacher();
Student s5 = (Student)p5;

代码中,Teacher类替换了Person类,但却又要替换另一个Student类。

2.可以替换的情况

2.1 子类可以直接隐式替换父类

Person p1 = new Teacher();
p1.Say();

代码讲解:实例化一个父类变量,但new子类,即转化成了子类(被子类替换),而之后这个变成子类的p1也可以顺利地使用父类的方法Say()。但原属于Teacher类的SayHi方法就不能使用了,因为它现在已经变成父类了。

猜你喜欢

转载自blog.csdn.net/Marshallren/article/details/87521733