//经常讲到继承、重载,但还是有人概念比较模糊,因此想写个例子加深理解 interface ILog { void WriteLine(string message); } class LogBase : ILog { public virtual void WriteLine(string message) { Debug.WriteLine(message); } } class A : LogBase { public override void WriteLine(string message) { base.WriteLine("A:" + message); } } class C : A { public override void WriteLine(string message) { base.WriteLine("C:" + message); } } class D : A { public override void WriteLine(string message) { Debug.WriteLine("D:" + message); } } //看清楚各个类的关系,开始测试,高手请飘过 //请不要去调试,看看自己有没有掌握 //问题1:输出1-6的结果是什么? //问题2:Main函数中创建了多少个对象? //问题3:cBase这个变量的类型是什么? class Program { static void Main(string[] args) { //重载 ILog log = null; log = new A(); log.WriteLine("测试重载"); //输出1 LogBase logBase = (LogBase)log; logBase.WriteLine("测试重载");//输出2 var c = new C(); var d = new D(); c.WriteLine("测试重载");//输出3 d.WriteLine("测试重载");//输出4 //强制转换 LogBase cBase = TryGetValue(()=> (LogBase)(ILog)c); LogBase dBase =TryGetValue(()=> (LogBase)(C)(ILog)d); log.WriteLine(cBase == null ? "null" : "cBase");//输出5 log.WriteLine(dBase == null ? "null" : "dBase");//输出6 //这句是为第三个问题准备的,结果就是答案 log.WriteLine(cBase.GetType().ToString()); } //尝试执行函数,如果不能执行,返回null static T TryGetValue<T>(Func<T> func) where T:class { try { return func(); } catch { return null; } } }

看答案之前,再来引入一个故事作为拓展,借用部门老大的名,XX总监、我们老大、最牛的人..., 你看就一个人,但是有很多的名字,程序里就是有很多的角色或者说访问接口

下面是答案,选中背景色不一样就可以看

问题1的输出结果: A:测试重载 A:测试重载 A:C:测试重载 D:测试重载 A:cBase A:null

问题2:因为只看到3个new,所以是3个对象,当然这个说法不全对;

问题3:一个对象,不管你把它当什么,它还是它自己,所以cBase还是c;