簡體   English   中英

鑄造派生類為基礎類

[英]Casting Deriving Class as Base Class

假設我有這個:

using System;

public class Program
{
    public static void Main()
    {
        BaseClass bc = new DerivedClass();
        bc.Method1();
        bc.Method2();
        Console.WriteLine(bc.GetType().FullName);

        // Output
        // Derived - Method1 (override)
       // Base - Method2
       // DerivedClass
    }
}

public class BaseClass
{
    public virtual void Method1()
    {
        Console.WriteLine("Base - Method1");
    }

    public virtual void Method2()
    {
        Console.WriteLine("Base - Method2");
    }
}

public class DerivedClass : BaseClass
{
    public override void Method1()
    {
        Console.WriteLine("Derived - Method1 (override)");
    }

    public new void Method2()
    {
        Console.WriteLine("Derived - Method2 (new)");
    }
}

如果派生類的實例變量被強制轉換為基類,並且該實例變量用於調用重寫的方法,則用override關鍵字覆蓋的方法將在派生類中執行實現,而被new關鍵字覆蓋的方法將執行在基類中執行實現。

上例中的變量bc如何轉換為基類?

我知道new關鍵字將覆蓋派生類中的方法實現,並且當派生類的實例變量用於調用重寫的方法時將執行該關鍵字,但是我不知道它是什么類型的Conversion。似乎既不是隱式也不是顯式,可能是類型轉換,但是我對語法感到困惑。

任何解釋表示贊賞。

我知道new關鍵字將覆蓋派生類中的方法實現

不會 。它不會覆蓋基類的方法。 它聲明了一個新的獨立方法,該方法的名稱相同且具有相同的簽名。 效果是它隱藏了在基類中聲明的相同簽名方法,從而有效地使在基類中聲明的相同簽名方法的調用復雜化。

在您的示例中,沒有任何“類型轉換”。 可以將類型轉換視為提供實例的特定視圖-將類合同的特定部分暴露給用戶。 僅此而已。

例:

// instance of DerivedClass exposing its full contract via the 'dc' variable
DerivedClass dc = new DerivedClass();

// the same instance of DerivedClass exposing its contract limited to what's declared in BaseClass
BaseClass bc = dc;

// calling Method2 as newly declared in DerivedClass
dc.Method2();

// calling Method2 as declared in BaseClass—the following two lines are equivalent
bc.Method2();
((BaseClass)dc).Method2();

實際上,沒有轉換。 您只能通過這種方式查看對象。

  • 如果您使用基類眼鏡進行查看,您將看到所有基類方法,其中包括派生類中重寫的Method1,但不包括派生類中的新Method2,因此您只會看到來自基類的Method2。
  • 如果你看它與派生類的眼鏡,你會看到所有的基類的方法,其包括從派生類中重寫的方法1,但它現在包括新的方法2,從派生類。 基類的原始虛擬Method1將不可見。

上例中的變量bc如何轉換為基類?

當您將新的DerivedClass實例分配給BaseClass類型的變量時,將執行此隱式轉換:

BaseClass bc = new DerivedClass();

啊,我剛剛找到了這個 ,我說那似乎不是一個隱式轉換,這是我的錯。

對於引用類型,從類到其直接或間接基類或接口中的任何一個始終存在隱式轉換。 不需要特殊的語法,因為派生類始終包含基類的所有成員。

Derived d = new Derived();
Base b = d; // Always OK.

暫無
暫無

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

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