2010-12-01 14 views
4

私は以下のようなクラスを持っていますが、私は "School、Country..etc .."の設定値をオーバーライドする必要があります。生徒のクラスが、私は、すなわちc#プロパティオーバーライド設定メソッド

public class Student : BaseClass 
{ 
     public String School { get; set; } 
     public String Country{ get; set; } 
} 

をベースクラスでそれを行うと、一般的な方法としてそれを使用する必要があります。 いくつかのいずれかが Student.School="Harvard"を設定し、 私は
Student.School="Harvard my custom value"としてそれを格納する必要があります。

注: 基本クラスではなく、基本クラスで基本的にOnPropertyChangedを呼び出します。

答えて

1

あなたは、基本クラスを使用すると、標準OODパターンや原理を使用して、基本クラスの中からそれらを変更することはできませんこれらのプロパティを持っていないのでPostsharp

+0

私はそれが無料ではないと思う、それを購入する必要があります:-) – kayak

+1

コミュニティバージョンがあります無料 –

0

基本的に、非仮想プロパティを上書きすることはできません。派生クラスで同じ名前の他のプロパティで非表示にすることはできますが、他のコードが基本クラスへの参照によってオブジェクトにアクセスしても、目的の効果は得られません。

+0

は、それが[MyCustomAttribute]パブリック文字列の学校{を取得または設定します;}のようなアスペクト指向プログラミングモデルによって行うことができます。 – kayak

+0

わかりませんが、そうなら、確かに 'BaseClass'側にコー​​ドが必要です。 – Vlad

+0

はい、私は同意する、いくつかの作業は、ベースクラスで行う必要があります。しかし、それを行う方法..? – kayak

0
public class Student : BaseClass 
{ 
    private string _school 
    public string School 
    { 
     get { return _school; } 
     set 
     { 
      if(value == "Harvard") 
       value = "Harvard custom"; 

      _school = value; 
     } 
    } 

    public String Country{ get; set; } 
} 

です。

SchoolプロパティがBaseClass、あなたはnewキーワードを使用するか、またはあなたがBaseClassをコントロールしている場合、その後、あなたはStudentクラスでそれがSchoolプロパティにvirtualキーワードを追加し、override可能である場合。

+0

しかし、私はStudentクラスでそれをしたくありません。私はBaseClassに持っています。それの終わりに共通の価値を付加する。 – kayak

+0

それから基本クラスでやってみると、ここであなたの問題は何か分かりません。その値を変更できるようにしたいのですか?イベントまたはデリゲートを使用するか、BaseClassのプロパティ設定ツールで仮想関数を呼び出して、それをStudentクラスでオーバーライドします。 – bevacqua

+0

私のポイントは書き込みセットの苦痛を望んでいません。 { if(value == "Harvard ") 値="ハーバードカスタム "; _school = value; } すべてのプロパティで、何とか私は自動的にそれを行う必要があります。 – kayak

0

これはBaseClassを変更するだけでは実行できません。このように考えてみましょう:自動プロパティを簡単に「注釈付ける」ことができれば、それらはすべて必要ではありません。<notot> INotifyPropertyChangedを実装するデータモデルクラスのマニュアルプロパティの実装</rant>役に立たないトンDependencyProperties)。

基本クラスで使用できるサブクラスにフックを指定する必要があります。あなたがこれを必要とするサブクラスの多くを持っている場合は、あなたが作成するために、Visual Studioのコードスニペットを使用することができますいずれか

public class Student : BaseClass 
{ 
    private string _school; 
    public String School 
    { 
     get { return _school; } 
     set { 
      _school = value; 
      DoMoreChanges(ref _school); // DoMoreChanges is defined in BaseClass 
     } 
    } 

    public String Country{ get; set; } 
} 

:実装すでに言及したのPropertyChangedは、一つの可能​​な解決策である、もう一つは、単純なメソッド呼び出しになりますコードまたはT4 templates

0

を試行し、側面でそれをしたい場合。

通常のプロパティまたは仮想プロパティのいずれかでプロパティをベースクラスに移動すると、プロパティのセットブロックで行う作業を変更して余分な作業を行うことができます。

しかし、これらを基本クラスに移動できず、Studentクラスを変更できない場合は、あなたが疑問に思っているように、Studentクラスなどの新しいクラスにクラスをカプセル化してから同様のプロパティを公開して、実際の生徒クラスにあなたが望むように呼び出すことになります。例えば

public class StudentProxy 
{ 
    private Student _student; 

    public StudentProxy(Student student) 
    { 
     this._student = student; 
    } 

    public String School 
    { 
     get { return _student.School; } 
     set 
     { 
      _student.School = value + " my custom value"; 
     } 
    } 

    public String Country 
    { 
     get { return _student.Country; } 
     set 
     { 
      _student.Country = value + " my custom value"; 
     } 
    } 
} 
関連する問題