2010-09-13 47 views

回答

7

是的。你会定义一个方法来隐藏父方法,并允许孩子覆盖。这种行为虽然可能有点奇怪。假设您有以下类:

public class A 
{ 
    public void DoSomething(){ Console.WriteLine("42!"); } 
} 

public class B : A 
{ 
    public virtual new void DoSomething(){ Console.WriteLine("Not 42!"); } 
} 

public class C : B 
{ 
    public override void DoSomething(){ Console.WriteLine("43!"); } 
} 

那么你的执行将看起来像:

A a = new A(); 
A bAsA = new B(); 
A cAsA = new C(); 
B b = new B(); 
B cAsB = new C(); 
C c = new C(); 

a.DoSomething(); // 42! 

b.DoSomething(); // Not 42! 
bAsA.DoSomething(); // 42! 

c.DoSomething(); // 43! 
cAsB.DoSomething(); // 43! 
cAsA.DoSomething(); // 42! 
+0

因此,我们可以说“B”方法中的“new”关键字表示类似于“如果实例是由我的特定类型(B)创建的,而不是我的父类型(A)?这只是一个巧合... – funkymushroom 2010-09-13 17:31:51

+1

@funkymushroom不,它的意思是'只有在代码与我的特定类型一起工作时才使用这个实现'注意bAsA说42 !,但实例是B类型/不同的是它是被访问为A类型的东西。 – eglasius 2010-09-13 17:44:09

1

是的,你可以结合两者。

virtual允许在派生类中

new允许您隐藏的旧方法重载的方法。

两者是互补的而不是矛盾的。

1

不要犹豫,自己尝试一下,Visual Studio让它变得简单。

class Base { 
    public virtual void Method() { } 
} 
class Derived : Base { 
    public virtual new void Method() { } 
}