[英]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。第一個變量plane
是Plane
類型,第二個變量aircraft
是Aircfart
類型。
然后, 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.