5

次のクラスがあります。

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 が null なのはなぜですか? BaseItem の場合、ExtendedItem はサブクラスであるため、そうすべきではありませんが、コードを実行すると null になります。誰でもこの問題で私を助けることができますか?

私がこれを行っている理由は、私が MVC3 を使用しており、同様の構造の一部である部分ビュー オブジェクト/モデルに渡しているためです。通常は、基本クラスのプロパティだけが必要です。

前もって感謝します。

アップデート

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;

それは今動作します

4

2 に答える 2

3

BaseContainer の元の基本プロパティを非表示にする new キーワードを使用しました。

ExtendedContainer をインスタンス化すると、基本クラスの元のプロパティではなく、子クラスに新しいプロパティが設定されます。

子クラスからプロパティを削除するだけで、すべてが機能するはずです。

于 2012-06-05T15:05:33.527 に答える
3

ここには、異なる値を格納できる 2 つの完全に別個のプロパティがあります。

オブジェクトにプロパティを設定しましたが、ExtendedContainer.itemプロパティを設定していませんBaseContainer.item

2 つのプロパティの名前がまったく異なると想像してみてください。一方を設定すると他方が変更されるとは思わないでしょう。CLR に関する限り、2 つのプロパティに名前が付いているのは単なる偶然です。

于 2012-06-05T15:05:43.247 に答える