簡體   English   中英

C#從基類隱藏,覆蓋和調用函數

[英]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()");
    }
}

目前,沒有virtualoverride關鍵詞。 當我編譯它時,我得到警告(當然是預期的)我試圖從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()         |

我希望你的表格清楚。 我有兩個問題

  1. 它是從基類調用函數的正確方法( ((MyBase)myDerived).MyMethod(); )? 我知道base關鍵字,但它只能從派生類的內部調用。 這樣對嗎?
  2. 為什么在最后一種情況下(使用virtualoverride修飾符)調用的方法來自派生類? 你能解釋一下嗎?

當您在覆蓋該方法的類型的實例上調用virtual方法時,即使您轉換為基類,也將始終調用被覆蓋的版本。

在覆蓋該方法的類上調用虛方法的基本實現的唯一方法是在使用base關鍵字調用該方法的派生類(而不是基類)中創建第二個方法。

一般來說,需要這樣做是一個糟糕的API設計的標志 - 如果你認為你需要調用基本版本,派生版本應該有一個不同的名稱。

至於你的第二個問題,你沒有改變你引用的對象的類型,只是你引用它的接口。 因此,如果你有一個繼承自A並覆蓋函數C的對象B,即使你將B稱為A,它仍然會調用派生類型最多的實現,在本例中為B.

你是對的 - 只能從派生類中調用base - Source

此頁面還提供了如何覆蓋基類定義的示例。

  1. 你是對的, base指的是給定實例的基類。
  2. 涉及的機制稱為多態:你最好在沒有警告的情況下工作。 面向自然物體的好方法是你提到的最后一種情況。

順便說一句,盡量避免編寫強制執行替換原則的代碼,換句話說,不要編寫依賴於類層次結構實現的代碼,因為如果添加新的派生類,則必須修改此代碼你的基類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM