问题由来:
有一功能P1,由类A完成。现需要将功能P1进行扩展,扩展后的功能为P,其中P由原有功能P1与新功能P2组成。新功能P由类A的子类B来完成,则子类B在完成新功能P2的同时有可能会导致原有功能P1发生故障。
例子:
两数相减的功能,由类A完成:
class Program { static void Main(string[] args) { A a = new A(); Console .WriteLine("100-50=" + a.func1(100,50)); Console .WriteLine ("100-80=" + a.func1(100,80)); Console.Read(); } } class A { public int func1(int a,int b) { return a - b; } }运行结果:
后来,我们需要增加一个新的功能:完成两数相加,然后再与100求和,由类B来负责。即类B需要完成两个功能:
1、两数相减 2、两数相加,然后再加100。
class Program { static void Main(string[] args) { B b = new B(); Console .WriteLine("100-50=" + b.func1(100,50)); Console .WriteLine ("100-80=" + b.func1(100,80)); Console.WriteLine("20+80+100=" + b.func2(80,20)); Console.Read(); } } class A { public int func1(int a,int b) { return a - b; } } class B : A { public int func1(int a,int b) { return a + b; } public int func2(int a,int b) { return func1(a,b) + 100; } }运行结果:
注:原本运行正常的相减功能发生了错误。原因就是类B在给方法起名时无意中重写了父类的方法,造成所有运行相减功能的代码全部调用了类B重写后的方法,造成原本运行正常的功能出现了错误。
解决方法:
当使用继承时,遵循里氏替换原则。类B继承类A时,除添加新的方法完成新
增功能P2外,尽量不要重写父类A的方法,也尽量不要重载父类A的方法。
定义:
如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的
所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类
型 T2 是类型 T1 的子类型。
通俗讲:
它包含以下4层含义: 1、子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。 2、子类中可以增加自己特有的方法。 3、当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的 输入参数更宽松。 4、当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类 更严格。
原文链接:https://www.f2er.com/javaschema/284231.html