微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

里氏转换原则

问题由来:

有一功能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.jb51.cc/javaschema/284231.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐