2013-07-12 13 views
6

インターフェイスからのプロパティを上書きする際に問題が発生しました。私はインターフェイスを実装する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は "Something else"を と出力しますが、この特定の時点ではオブジェクトがどのような種類のクラスであるかわかりません。 (私は10の異なるサブクラスを持っています)。

すべてのオブジェクトを実際のクラスにキャストする必要がありますか?このリストには10​​0〜200のオブジェクトがあり、10種類のクラスがあります。あるいはこれを行うための他の方法がありますか?

ありがとうございました:)

+1

オーバーライド/バーチャル方法で問題を解決できますか? –

+0

ありがとう、この方法でうまく動作:) – Koryu

答えて

8

あなたは、基本クラスのプロパティ実装virtualを行い、派生クラスで実装上override代わりのnewを置く必要があります。これで問題は解決するはずです。

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

3

あなたは間違っています。次の操作を行いますvirtualキーワード

  • を使用して

    • 宣言の基本クラスのプロパティ期待どおりの結果であるとしてプロパティ宣言
    public class BaseClass : Inf 
    { 
        public virtual string Info 
        { 
         get { return "Something"; } 
        } 
    } 
    
    
    public class SubClass : BaseClass 
    { 
        public override string Info 
        { 
         get { return "Something else"; } 
        } 
    } 
    

    をサブクラスに次のoverrideキーワードを追加します。

    ここオーバーライドし、多型について詳しく読む:Polymorphism (C# Programming Guide)

  • 2

    あなたはプロパティを「新規」にしてチェーンを壊しました。それを無効にする必要があります:

    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"; } 
        } 
    } 
    
    関連する問題