上周面试两场,两家企业都有类型的这道题,只不过一个用override一个用new ,看了<<你必须知道的.net>>里面有这个问题的解释,记录下来备忘。
第一家公司
public abstract class A { public A() { Console.WriteLine("A"); } public virtual void Say() { Console.WriteLine("ASay"); } } public class B : A { public B() { Console.WriteLine("B"); } public override void Say() { Console.WriteLine("BSay"); } }
执行 A a = new B
a.Say(); 问返回什么,答案是 A B BSay这个简单,书上的解释 关注对象原则:调用子类还是父类的方法取决于创建的对象是子类对象还是父类对象,这里B的Say方法用Override覆写了父类方法,自然返回BSay
第二家公司用new 替换了 override,答案就应该是 A B ASay,为什么呢?使用New隐藏基类的实现,其实就是创建了与父类同名的另一个方法,因为是另一个方法,而a是A的引用类型,所以就调用了A的方法。要想调用B的方法,只能B b = new B();
有两个原则在<<你必须知道的.net>>中描述的
1、关注对象原则
2、执行就近原则,对于同名的字段或方法,编译器是按照顺序来查找引用,首先访问离它近的字段或方法