里氏转换原则

前端之家收集整理的这篇文章主要介绍了里氏转换原则前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

问题由来:

有一功能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

猜你在找的设计模式相关文章