加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

里氏转换原则

发布时间:2020-12-13 21:59:43 所属栏目:百科 来源:网络整理
导读:问题由来: 有一功能P1,由类A完成。现需要将功能P1进行扩展,扩展后的功能为P,其中P由原有功能P1与新功能P2组成。新功能P由类A的子类B来完成,则子类B在完成新功能P2的同时有可能会导致原有功能P1发生故障。 例子: 两数相减的功能,由类A完成: class Pro

问题由来:

有一功能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、当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类 更严格。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读