zoukankan      html  css  js  c++  java
  • 里氏替换原则

    古人云呐,有疑问了就要谷哥,谷哥到的说的我晕晕乎乎,怎么根据小弟下面的问题去理解里氏替换原则呢?


        class Fax
    {
    public void FaxDoSome()
    {
    Console.WriteLine("Fax's public Method");
    }
    protected void SelfDo()
    {
    Console.WriteLine("Fax's protected Method");
    }
    }
    class LaserPrinter : Fax
    {
    public void LaserPrinterDoSome()
    {
    Console.WriteLine("LaserPrinter's public Method");
    }
    private static void Do()
    {
    Console.WriteLine("laserPrinter's private Method");
    }
    }
    class Program
    {
    private static T Min<T>(T o, T b)where T:class,IComparable<T>
    {
    if (o.CompareTo(b) < 0) return o;
    return b;
    }
    static void Main()
    {
    Fax f = new LaserPrinter();
    f.FaxDoSome();//只能调用Fax的一个方法
    Console.WriteLine(f.GetType());//LaserPrinter 既然是LaserPrinter,那为什么不能调用LaserPrinter的方法呢
    Console.WriteLine(f is Fax);//true
    Console.WriteLine(f is LaserPrinter);//true f到底是什么类型。。怎么都是true?
    Console.WriteLine(f is Object);//到这里我就有点明白为什么是true了。但是f.GetType()得到的为什么是LaserPrinter呢
    //里氏替换原则!该怎么理解?哪位大牛能指点指点,帮助大家共同进步!
    Console.ReadKey();
    }

    }
    根据这个例子怎么去理解里氏替换原则!?哪位大牛能指点指点,帮助大家共同进步!
    在代码里很大一部分逻辑功能,都是用父类的对象实现的。具体要体现哪一个子类的特性,只要在代码开始时将这个子类对象转换成父类对象即可。里氏替换原则保证了两个子类拥有相同的属性和方法,并且都可以替换成父类对象,以父类对象的身份在代码中执行,这样就使得大多数关于父类的逻辑代码可以最大范围地被复用。子类可以重写父类的方法,但是,每个子类都必须保证实现了父类在逻辑代码中的每一个用到的方法。
    通过里氏代换原则给我们带来了什么样的启示?
        类的继承原则:如果一个继承类的对象可能会在基类出现的地方出现运行错误,则该子类不应该从该基类继承,或者说,应该重新设计它们之间的关系。
        
    动作正确性保证:符合里氏代换原则的类扩展不会给已有的系统引入新的错误。
  • 相关阅读:
    BZOJ 3251 树上三角形:LCA【构成三角形的结论】
    BZOJ 2442 [Usaco2011 Open]修剪草坪:单调队列优化dp
    2018湖南省赛选拔
    扩展BSGS-传送门
    倒数第N个字符串
    HDU-6070 Dirt Ratio(二分+线段树+分数规划)
    第一场多校
    HDU5923-Prediction-有继承味道的并查集
    POJ2516费用流
    POJ3436:ACM Computer Factory-最大流
  • 原文地址:https://www.cnblogs.com/smailxiaobai/p/2287330.html
Copyright © 2011-2022 走看看