簡體   English   中英

C#和繼承。當對象是擴展類對象時,基類屬性為null

[英]C# and inheritance. Base class property is null when the object is Extended class object

我有以下課程:

public class BaseContainer
{
   public BaseItem item {get; set;}
}

public class ExtendedContainer : BaseContainer
{
   new public ExtendedItem item {get; set;}
}

public class BaseItem{
   public string Name { get; set; }
}

public class ExtendedItem : BaseItem
{
   public string Surname { get; set; }
}

然后我有以下說明:

ExtendedItem ei = new ExtendedItem { Name = "MyName", Surname = "MySurname" };
ExtendedContainer ec = new ExtendedContainer { item = ei };
BaseContainer bc = ec;
string temp = bc.item.Name;  // bc.item is null, why?

為什么bc.item為空? 它不應該因為ExtendedItem是BaseItem的子類,但是當我運行代碼時它是null。 任何人都可以幫我解決這個問題嗎?

我這樣做的原因是我使用MVC3並且我傳遞給部分視圖對象/模型是類似結構的一部分,我通常只需要基類中的屬性。

提前致謝。

UPDATE

Jon是對的,我正在訪問不同的對象。 我做的是修復它是使用構造函數將項屬性設置為同一個對象。 像這樣:

public class BaseContainer
{
    public BaseItem item {get; set;}
    public BaseContainer(BaseItem item)
    {
        this.item = item;
    }
}

public class ExtendedContainer : BaseContainer
{
    public ExtendedItem item {get; set;}

    public ExtendedContainer(ExtendedItem item) : base(item)
    {
        this.item = item;
    }
}

public class BaseItem{
    public string Name { get; set; }
}

public class ExtendedItem : BaseItem
{
    public string Surname { get; set; }
}

然后我只是創建對象:

    ExtendedItem ei = new ExtendedItem { Name = "MyName", Surname = "MySurname" };
    ExtendedContainer ec = new ExtendedContainer(ei);
    BaseContainer bc = ec;
    string temp = bc.item.Name;

它現在有效

您已經使用了new關鍵字,它隱藏了BaseContainer中的原始基本屬性。

實例化ExtendedContainer時,您要在子類上設置新屬性,而不是在基類上設置原始屬性。

只需從子類中刪除該屬性,一切都應該工作。

這里有兩個完全獨立的屬性,可以存儲不同的值。

您已在對象上設置ExtendedContainer.item屬性,但尚未設置BaseContainer.item屬性。

想象一下,這兩個屬性有完全不同的名稱 - 你不會指望設置一個改變另一個,那么,你呢? 就CLR而言,這兩個屬性具有名稱的事實僅僅是巧合。

暫無
暫無

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

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