本文主要用实际讲解下 new、override 的隐藏、覆盖。
如果父类有一个方法,派生类也有这个方法,我们讨论以下四种情况:
1、父类方法无修饰符,派生类方法也无修饰符。
2、父类方法无修饰符,派生类方法 new 修饰符。
3、父类方法 virtual 修饰符,派生类方法 new 修饰符。
4、父类方法 virtual 修饰符,派生类方法 override 修饰符。
前三个其实效果都是一样的,是隐藏。不过第一个会有警告,Visual Studio 会提示你是不是搞忘了加 new。
最后一个是覆盖。
再看示例,并看看方法嵌套的情况。
上述代码的结果是 12,因为 B 覆盖了,所以调用 B 总是调用派生类的,B 中调用的 A,也是优先在自己的类中找,所以尽管 B 仅仅是隐藏,仍然是在派生类中找。
上述代码的结果是 1b,因为 B 仅仅是隐藏,所以调用的还是 C 中的 B,而 B 调用的 A,由于 A 被覆盖,所以是派生类的 A。
总结一下:
将派生类对象赋给基类时,调用其方法时:
还没完
如果派生类里面要强制访问父类的方法怎么办呢?
使用 base,比如:base.F1();
如果孙子类里面要强制访问爷爷的方法怎么办呢?
除非爸爸没有拦截(不管是 new 还是 override),也就是说除非爸爸没有隐藏、覆盖爷爷的方法,否则孙子没办法直接访问爷爷的方法,base 对应的是爸爸的。
相关阅读