2012-09-04 49 views
4

鑑於2種類型使用一個派生類對象訪問一個重寫基類成員(C#)

class A { public virtual void Hello() { Console.WriteLine("A"); } } 
class B : A { public override void Hello() { Console.WriteLine("B"); } } 

和 'B' B b = new B();

能訪問的AHello()方法通b的一個實例? (我可以想到在B中暴露A屬性,但不知道是否有另一種方式)

我知道這是可能的c++,但在c#中我的腦袋撓了撓頭。

PS:請不要談論'你爲什麼要這樣?'或「這是一個糟糕的設計」等。

回答

9

不是從外面看。

從內的,實例可以調用,通過base.Hello(),所以你可以添加一個:

public void Foo() { base.Hello(); } 
+0

哈..所以我問了一個問題,即使是馬克答不上來,哈哈:)。 我知道'基地',但想知道從外面訪問。 –

+4

@AntonyThomas哦,我可以回答:答案是:「不從外面」。如果你試圖通過在IL中靜態調用它來作弊,那麼CLI將會拋出一個「操作可能會破壞運行時的穩定性」。它**不會讓你**做到這一點。 –

+0

所以,我想我可以通過'B'中的propery將'base'('A')公開爲'public A aProperty {get {return base; }}'但編譯器抱怨。那麼我是否可以通過**派生的**來揭示**基**? –

1

這是不可能在C#。抱歉。

1

您可以嘗試陰影:

class A { public virtual void Hello() { Console.WriteLine("A"); } } 
class B : A { public new void Hello() { Console.WriteLine("B"); } } 

然後,你可以這樣做:

 A b = new B(); 
     b.Hello(); //prints A 
     (B)b).Hello(); //prints B 

     B b1 = new B(); 
     b1.Hello(); //prints B 
+0

這很有趣。我認爲'override'和'new'的行爲應該是一樣的。你能否給我技術性的解釋,爲什麼會發生這種情況? –

+2

@Antony與'new',第二個'Hello'(在'B')是在一個*完全獨立的* V表的記錄等;與多態性完全無關 - 基本上,只是碰巧具有相同名稱的方法。通常,這種(方法隱藏)是不鼓勵的。 –

相關問題