簡體   English   中英

為什么要通過關鍵字 new 對基類進行強制轉換?

[英]Why does the cast to the baseclass work by the keyword new?

關於這篇文章,似乎無法通過關鍵字as將派生的 class 轉換為它的基數 class。

在那篇文章的代碼中使用了關鍵字override 但是當我改用關鍵字new時,對基類的強制轉換就變得可見了:

// base class
public class Aircraft
{
    public virtual void fly()
    {
        Console.WriteLine("Aircraft flies");
    }
}

// derived class
public class Plane : Aircraft
{
    public new void fly()
    {
        Console.WriteLine("Plane flies");
    }
}

public class Program
{
    public static void Main()
    {
        var plane = new Plane();
        Console.WriteLine(plane.GetType()); // "Plane"
        plane.fly(); // "Plane flies"
    
        var aircraft = plane as Aircraft; // <-- cast to base class
        Console.WriteLine(aircraft.GetType()); // "Plane"
        aircraft.fly(); // "Aircraft flies"
    }
}

代碼aircraft.GetType(); 表示沒有發生對基數 class 的強制轉換。 它仍然是一架Plane 但是aircraft.fly(); 說,對基地 class 的演員表有效,因為該方法說:“飛機飛行”。

誰能解決我的困惑?

您在此處創建了一個 object:

new Plane();

它將始終是Plane類型,並且無法更改此類型(那么它將是另一個 object)。 Cast 不會“更改類型”object。

現在你有兩個變量指向這個 object。第一個變量planePlane類型,第二個變量aircraftAircfart類型。

然后, Plane class 有兩個具有相同簽名的獨立方法 - fly() 一個繼承自基礎Aircraft class,另一個使用new關鍵字聲明。 當您調用plane.fly()時 - 編譯器必須從兩種方法中進行選擇,並選擇帶有new關鍵字的方法(按設計)。 當您調用aircraft.fly()時 - 編譯器只有一種方法需要考慮 - fly()Aircraft中定義。

如果您要override class Plane中的 fly 方法,而不是聲明具有相同簽名的新方法 - 那么在兩種情況下都將只存在並調用一個fly()方法,實現 class Plane

暫無
暫無

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

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