{ZHUAXIAead3dc42408ec383161c818b0f5bad3eUnion}
今天金山笔试,出了这么一道题,做题的途中忽然想到了Blog好久不更新了。。。。汗,溜号啊
- public abstract class A
- {
- public A()
- {
- Console.WriteLine('A');
- }
- public virtual void Fun()
- {
- Console.WriteLine("A.Fun()");
- }
- }
- public class B: A
- {
- public B()
- {
- Console.WriteLine('B');
- }
- public new void Fun()
- {
- Console.WriteLine("B.Fun()");
- }
- public static void Main()
- {
- A a = new B();
- a.Fun();
- }
- }
结果是
A
B
A.Fun()
结果倒是显而易见,不过我想起刚看C#时,对于visual\override\new的区别来着,当时就有点糊涂。
MSDN的解释是这样的
在 C# 中,派生类可以包含与基类方法同名的方法。
- 基类方法必须定义为 virtual。
- 如果派生类中的方法前面没有 new 或 override 关键字,则编译器将发出警告,该方法将有如存在 new 关键字一样执行操作。
- 如果派生类中的方法前面带有 new 关键字,则该方法被定义为独立于基类中的方法。
- 如果派生类中的方法前面带有 override 关键字,则派生类的对象将调用该方法,而不是调用基类方法。
- 可以从派生类中使用 base 关键字调用基类方法。
- override、virtual 和 new 关键字还可以用于属性、索引器和事件中。
当时是相当的糊涂了。啥玩意,多态咋还出来一个new呢
后来慢慢理解了。。。
visual是override的前提与基础,既只有在基类的函数是visual的情况下,你才能在子类中override,否则编译会报错
new则是跟基类没多大关系的,除了名字相同之外。它独立于基类,相当于在子类中添加了一个新的方法。
我写了一个更合适的例子
- public abstract class A
- {
- public void F()
- {
- System.Console.WriteLine("A.F");
- }
- public virtual void G()
- {
- System.Console.WriteLine("A.G");
- }
- }
- public class B:A
- {
- public new void F()
- {
- System.Console.WriteLine("B.F");
- }
- public new void G()
- {
- System.Console.WriteLine("B.G");
- }
- }
- public class C:A
- {
- public new void F()
- {
- System.Console.WriteLine("C.F");
- }
- public override void G()
- {
- System.Console.WriteLine("C.G");
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- B b = new B();
- C c = new C();
- A a = b;
- A d = c;
- a.F();
- a.G();
- b.F();
- b.G();
- c.F();
- c.G();
- d.F();
- d.G();
- Console.Read();
- }
- }
结果如下
A.F
A.G
B.F
B.G
C.F
C.G
A.F
C.G
值得注意的是d的调用,因为C的G()实现是override,因此c.G()隐藏了A.G(),输出结果就是c的输出结果,而b的G()实现是new,独立于基类,因此A.G()并没有被覆盖,a调用是仍然是调用的的A自己的G(), b调用的是new G().


