2010-09-13 48 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() { } 
}