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.避免埋雷
申明些变量,参数,属性,字段,最后都是基于基类。