簡體   English   中英

鑄造后的物體類型?

[英]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 ,而派生類CircleSquare等具有虛擬方法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.

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