2017-04-07 14 views
0

如果我們有這樣的類:如果我這樣做重寫一個方法並轉換爲基類型後,將調用哪個方法?

public class c : a{ 
    public override void b(){ Console.WriteLine("c"); } 
} 

public class a{ 
    public void b(){ Console.WriteLine("a"); } 
} 

,然後將該類

a _a = new c(); 
_a.b(); 

會發生什麼?哪種方法會被調用?來自基本類型的,還是被重寫的?

+9

試試看並找出答案。 – Rob

回答

1

會發生什麼?哪種方法會被調用?來自基本類型的一個, 或重寫的?

首先,你不是從類c覆蓋a類中的方法b因爲你還沒有將其標記爲virtual(應該給你一個編譯時錯誤,如果你已經嘗試過)。但是,如果標記a類內的方法如virtual象下面這樣:

public class a 
{ 
    public virtual void b() { Console.WriteLine("a"); } 
} 

然後將要打印出的結果將是"c"。原因是由於overriding機制。

0

這是一個錯誤,基類的方法必須標記爲virtual,abstractoverride

在你在你的榜樣,你確實添加了abstractvirtual基類的方法調用的情況下,重寫的方法將被執行 - 這是override整個點。

如果你不想基類的方法是virtualabstract,您可以在子類中的方法使用new,它會被替換,而不是覆蓋。也就是說,參考_a將被執行的類的方法b()將被執行,在您的示例中,將執行類a上的方法b

0

有三種方法可以「重用」一種方法。

覆蓋方法要求該方法標記爲抽象或虛擬。重寫方法時,重寫的方法將被調用,無論如何。但是,您可以調用基方法,如:

base.Method(); 

重載允許你改變你的方法使用參數的類型和數量。所以:

public int Method(double B); 

最後你有新的:

public int Method(int A); 

可以爲超載。這允許您在派生類中替換Method。如果你有一個方法:

public int Method(); 

在一個基類,你在派生類中的新方法將在派生類中被調用創建一個新的方法

public new int Method(); 

但基類方法如果你將你的課程轉換回基類,則會被調用。我所知道的並不是一個非常明確的解釋,但我現在時間很短。

希望這會有幫助 Danny

相關問題