里氏替换原则

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


    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();
}

}
根据这个例子怎么去理解里氏替换原则!?哪位大牛能指点指点,帮助大家共同进步!
在代码里很大一部分逻辑功能,都是用父类的对象实现的。具体要体现哪一个子类的特性,只要在代码开始时将这个子类对象转换成父类对象即可。里氏替换原则保证了两个子类拥有相同的属性和方法,并且都可以替换成父类对象,以父类对象的身份在代码中执行,这样就使得大多数关于父类的逻辑代码可以最大范围地被复用。子类可以重写父类的方法,但是,每个子类都必须保证实现了父类在逻辑代码中的每一个用到的方法。
通过里氏代换原则给我们带来了什么样的启示?
    类的继承原则:如果一个继承类的对象可能会在基类出现的地方出现运行错误,则该子类不应该从该基类继承,或者说,应该重新设计它们之间的关系。
    
动作正确性保证:符合里氏代换原则的类扩展不会给已有的系统引入新的错误。
posted @ 2011-12-16 09:16  Rookier  阅读(752)  评论(2编辑  收藏  举报