[英]Type of object after as cast?
鑒於該代碼:
class B
{
public virtual string Method()
{
return "base";
}
}
class D : B
{
public override string Method()
{
return "derived";
}
}
D d = new D();
B b = d as B;
b.Method();
“派生”是輸出。
但是為什么呢? 我的意思是,b是類型B的新對象,不是嗎? 還是它與d是同一對象(在內存中)? 如果是這樣,那么b或B的運行時類型是什么?
謝謝
規則很簡單: b
是對類型D
的對象的引用。 您可以說b
的運行時類型為D
但這並不是特別有用的術語。
你可以做
B b = new D();
b.Method();
而且您仍然會“派生”。 正如@Bathsheba提到的,重要的是對象類型而不是引用。
想象一下一個典型的OOP示例,其中有一個基類Shape
,而派生類Circle
, Square
等具有虛擬方法Area
..如果您有如下方法:
void ShowArea(Shape shape)
{
Console.WriteLine(shape.Area());
}
引用無關緊要(而是實際的對象類型)這一事實使上述方法可以接受任何類型的Shape
並仍然打印正確的區域
b是類型B的新對象,不是嗎?
不, b
是類型B
的現有對象,它指向您在其上方創建的同一對象: d
。 唯一的區別是,已將對象強制轉換為其父類型B
,因此b
被視為B
而不是派生自更廣泛的類型D
之所以得到輸出“派生”,是因為該方法在派生類中被覆蓋,這就是覆蓋的工作方式。 僅僅因為您將變量(即b
)聲明為派生類型較低的類型B
並不意味着它實際上仍不是派生類型較高的類型D
這就是多態性的本質。
B b = d as B;
我相信這行代碼僅將d轉換為B類的類型,但該值仍保持為“派生”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.