c#-设计模式-里氏替换原则

1解释,在任何父类或接口出现的地方,都可以用子类来替换

案例.面试常出现的,

 1 static void Main(string[] args)
 2         {
 3             // 正常都是编译时确定,因为可能由工厂生产,右边完全不能确定是什么类型。
 4             ParentClass instanceClass = new ChildClass();
 5             instanceClass.CommonMthod();//父类 普通方法由左边决定,编译时决定
 6             instanceClass.VirthodMthod();//子类 虚方法由右边决定,运行时决定
 7             instanceClass.AbstractMthod();//子类 抽象方法由右边决定 运行时决定
 8             {
 9                 //父类 
10                 typeof(ChildClass).GetMethod("CommonMthod").Invoke(instanceClass,null);
11             }
12             {
13                 //子类 运行时决定的。
14                 Console.WriteLine("--------------------------------");
15                 dynamic dInstance = new ChildClass();
16                 dInstance.CommonMthod();
17             }
18             Console.ReadKey();
19         }
20         public abstract class ParentClass {
21             public virtual void CommonMthod() {
22                 Console.WriteLine("我是父类的CommonMethod");
23             }
24             public virtual void VirthodMthod()
25             {
26                 Console.WriteLine("我是父类的VirthodMthod");
27             }
28             public abstract void AbstractMthod();
29         }
30         public class ChildClass : ParentClass
31         {
32             public  void CommonMthod()
33             {
34                 Console.WriteLine("我是子类的CommonMethod");
35             }
36             public override void VirthodMthod()
37             {
38                 Console.WriteLine("我是子类的VirthodMthod");
39             }
40             public override void AbstractMthod()
41             {
42                 Console.WriteLine("我是子类的VirthodMthod");
43             }
44         }

注意点:

1,子类必须完全实现父类有的方法,如果子类没有父类的某项东西,就断掉继承

2,子类可以有父类没有的东西。所有子类出现的地方,不一定能用父类代替。比如子类有自己特有的方法。

3,透明,就是安全,父类的东西换成子类,父类的行为并没有发生变化(普通方法还是调用父类的,只有父类重新override方法,才会调用子类的)

  a.父类实现的方法,子类不要去new。

       b.父类已经实现的东西,想改的话,就必须用virtural,override.避免埋雷

申明些变量,参数,属性,字段,最后都是基于基类。

 

c#-设计模式-里氏替换原则

上一篇:科普文:从人人网看网络科学(Network Science)的X个经典问题


下一篇:C# 通过ServiceStack 操作Redis——Set类型的使用及示例