[英]C# Hiding, overriding and calling function from base class
我正在學習C#,我遇到了以下問題。 我有兩個類:base和derived:
class MyBase
{
public void MyMethod()
{
Console.WriteLine("MyBase::MyMethod()");
}
}
class MyDerived: MyBase
{
public void MyMethod()
{
Console.WriteLine("MyDerived::MyMethod()");
}
}
目前,沒有virtual
和override
關鍵詞。 當我編譯它時,我得到警告(當然是預期的)我試圖從MyBase
類隱藏MyMethod
。
我想要做的是從具有派生類實例的基類調用該方法。 我是這樣做的:
MyDerived myDerived = new MyDerived();
((MyBase)myDerived).MyMethod();
當我沒有在方法中指定任何virtual
等關鍵字時,它工作正常。 我試着把關鍵字組合起來,得到了以下結果:
| MyBase::MyMethod | MyDerived::MyMethod | Result printed on the console |
| -----------------|---------------------|-------------------------------|
| - | - | MyBase::MyMethod() |
| - | new | MyBase::MyMethod() |
| virtual | new | MyBase::MyMethod() |
| virtual | override | MyDerived::MyMethod() |
我希望你的表格清楚。 我有兩個問題 :
((MyBase)myDerived).MyMethod();
)? 我知道base
關鍵字,但它只能從派生類的內部調用。 這樣對嗎? virtual
和override
修飾符)調用的方法來自派生類? 你能解釋一下嗎? 當您在覆蓋該方法的類型的實例上調用virtual
方法時,即使您轉換為基類,也將始終調用被覆蓋的版本。
在覆蓋該方法的類上調用虛方法的基本實現的唯一方法是在使用base
關鍵字調用該方法的派生類(而不是基類)中創建第二個方法。
一般來說,需要這樣做是一個糟糕的API設計的標志 - 如果你認為你需要調用基本版本,派生版本應該有一個不同的名稱。
至於你的第二個問題,你沒有改變你引用的對象的類型,只是你引用它的接口。 因此,如果你有一個繼承自A並覆蓋函數C的對象B,即使你將B稱為A,它仍然會調用派生類型最多的實現,在本例中為B.
你是對的 - 只能從派生類中調用base
- Source 。
此頁面還提供了如何覆蓋基類定義的示例。
base
指的是給定實例的基類。 順便說一句,盡量避免編寫強制執行替換原則的代碼,換句話說,不要編寫依賴於類層次結構實現的代碼,因為如果添加新的派生類,則必須修改此代碼你的基類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.