11

インターフェイスに由来するプロパティを上書きする際に問題が発生しました。インターフェイスを実装する基本クラスを 1 つ取得しました。このクラスには約 10 のサブクラスがあります。サブクラスは、場合によってはインターフェイスから取得したプロパティを上書きする必要があります。

私の問題は、オブジェクトが持つクラスのタイプを知らずにプロパティにアクセスし、オブジェクトは常に上書きされたサブクラスのプロパティ値ではなく基本クラスのプロパティ値を返すことです。

簡略化されたコード例:

public interface Inf
{
   string Info
   {
     get;      
   }
}


public class BaseClass : Inf
{

   public string Info
   {
      get { return "Something"; }
   }

}


public class SubClass : BaseClass 
{

   new public string Info
   {
      get { return "Something else"; }
   }

}

別のクラスでは、プロパティにアクセスする必要があります。現時点では、オブジェクトがベースまたはサブクラスのタイプであるかどうかはわかりません

List<BaseClass> listBase = new List<BaseClass>();
listBase.Add(new BaseClass());
listBase.Add(new SubClass());

foreach (BaseClass obj in listBase)
{
  Console.WriteLine(obj.Info);
}

出力:

Something
Something

必要な出力:

Something
Something else

((SubClass)obj).Info は「何か他のもの」を出力しますが、この特定の時点では、オブジェクトがどのような種類のクラスなのかわかりません。(私は約10の異なるサブクラスを持っています)。

すべてのオブジェクトを実際のクラスにキャストする必要がありますか? このリストには 100 ~ 200 個のオブジェクトがあり、約 10 個の異なるクラスがあります。または、これを行う他の方法はありますか?

どんな助けでも大歓迎です:)

4

3 に答える 3

12

virtual基本クラスでプロパティの実装を作成し、override代わりnewに派生クラスの実装に配置する必要があります。これで問題は解決するはずです。

Info現在、インターフェイスからプロパティの実装を提供する唯一のクラスInfは your BaseClass. あなたのコードによると、コンパイラは、派生クラスSubClassが同じ名前の新しいプロパティを導入すると考えていますが、これは合法です。このようなプロパティは、インターフェイスを介してではなく、クラスを直接使用する場合にのみアクセスできます。

于 2013-07-12T11:02:51.227 に答える
8

プロパティを「新しく」することでチェーンを壊しました。それをオーバーライドする必要があります:

public interface Inf
{
   string Info
   {
     get;      
   }
}

public class BaseClass : Inf
{
   public virtual string Info
   {
      get { return "Something"; }
   }
}

public class SubClass : BaseClass 
{    
   public override string Info
   {
      get { return "Something else"; }
   }
}
于 2013-07-12T11:03:49.927 に答える
5

あなたはそれを間違っています。以下を実行します。

  • virtualキーワードを使用して基本クラスのプロパティを宣言する
  • overrideサブクラスのプロパティ宣言の隣にキーワードを追加
public class BaseClass : Inf
{
    public virtual string Info
    {
        get { return "Something"; }
    }
}


public class SubClass : BaseClass
{
    public override string Info
    {
        get { return "Something else"; }
    }
}

それで、結果はあなたの期待どおりです。

オーバーライドとポリモーフィズムについて詳しくは、ポリモーフィズム (C# プログラミング ガイド)をご覧ください。

于 2013-07-12T11:02:48.193 に答える