2009-07-10 21 views
5

これはちょっとわかりにくいですが、現在のプロジェクトでC#を使用していますが、派生クラスのメンバ変数をオーバーライドする方法を見つけようとしていますが、オーバーライドされた変数には基本クラスメソッドでアクセスします。物事をより面白くするためには、オーバーライドされたメンバ変数が静的である方が望ましいでしょう(これは以下のサンプルコードには示されていません)。C#基本クラスメソッドで使用されるメンバー変数のオーバーライド

class baseclass 
{ 
    protected string[] array = null; 

    public string method() 
    { 
     string str = ""; 
     foreach (string x in this.array) 
     { 
      str += x + " "; 
     } 

     return str; 
    } 
} 

class subclass1 : baseclass 
{ 
    new string[] array = new string[] 
    { 
     "class1value1", 
     "class1value2", 
     "class1value3", 
     "class1value4" 
    }; 
} 

class subclass2 : baseclass 
{ 
    new string[] array = new string[] 
    { 
     "class2value1", 
     "class2value2", 
     "class2value3", 
     "class2value4" 
    }; 
} 

これが動作しない理由についてどのような考えや、それを回避する方法:ここで

私のサンプルコードはありますか?

+1

メンバー変数はメソッドのような多型ではない影響を与えます。配列を初期化して、各サブクラスに目的の値を格納します。 –

答えて

8

仮想プロパティを使用できない理由はありますか?それはあなたが探している機能を正確に提供します。それはただのフィールドではありません。

protected abstract string[] array { get; } 

...

protected override string[] array { get { return new string[]{"...","..."}; }} 
+0

です。私はこれを今のところ遊んでいます...これはうまくいくかもしれません。私の考えにもっと自信を与えてくれてありがとう。 –

1

なぜ変数をオーバーライドする必要がありますか?あなたのコードから見ると、値を設定するだけで十分でしょうか?

さらに、静的変数は(インスタンスではなく)クラスに結び付けられているため、どのような状況でも上書きすることはできません。

+0

あなたは別のデータを保持するために別のクラスを作成しています。+1は –

1

は、単に新しいを使用しないでください。サブクラスのコンストラクタに配列を設定します。

EDIT:コードで:

class subclass1 : baseclass 
{ 
    public subclass1() 
    { 
     array = new string[] 
     { 
      "class1value1", 
      "class1value2", 
      "class1value3", 
      "class1value4" 
     }; 
    } 
} 

class subclass2 : baseclass 
{ 
    public subclass2() 
    { 
     array = new string[] 
     { 
      "class2value1", 
      "class2value2", 
      "class2value3", 
      "class2value4" 
     }; 
    } 
} 
+0

これは静的配列を持てない –

1
class BaseClass 
{ 
    public virtual string Method() 
    { 
     return string.Empty; 
    } 
} 

abstract class BaseClass<T> : BaseClass where T : BaseClass<T> 
{ 
    protected static string[] strings; 

    public override string Method() 
    { 
     return string.Join(" ", strings); 
    } 
} 

class Subclass1 : BaseClass<Subclass1> 
{ 
    static Subclass1() 
    { 
     strings = new[] { "class1value1", "class1value2", "class1value3" }; 
    } 
} 

class Subclass2 : BaseClass<Subclass2> 
{ 
    static Subclass2() 
    { 
     strings = new[] { "class2value1", "class2value2", "class2value3" }; 
    } 
} 

重要な部分は、基本的には文字列配列へのインデックスとして機能する汎用パラメータTです。

1

多態性の動作を配列から取得しようとしていますが、クラスのローカル動作のために定義しています。

配列は常に、基本クラスの配列にアクセスするためにコンパイルする仮想または基本クラスのメソッド()である必要があります - 配列はまた、プロパティではありませんこれを行うためのフィールド、すなわちあるべき

string [] _array = {...}; /基本クラスのローカル値 protected virtual string [] array {get {return _array; }} //はオーバーライド配列プロパティを作る

そしてサブクラスで、あなたがする必要があります

文字列[] _array = {...}; //サブクラスのローカル値 仮想文字列[] array {get {return _array; }} //これは希望を取得するためには、基本クラスのプロパティ

を上書きします

関連する問題