2016-09-27 13 views
0

私はdesing質問があります。私は基底クラスと多くの派生クラスを持っていると言うことができます。派生クラスのコンストラクタの後に何かを実行する

class MyBase 
{ 
    MyBase() 
    { 
     Record(); 
    } 

    void Record() 
    { 
     /// this line is able to handle every object 
     Recorder.Process(this); 
    } 
} 

class DerivedA : MyBase 
{ 
    public int SpecialPropertyOfA { get; set; } 
    DerivedA(int specialPropertyOfA) 
    { 
     SpecialPropertyOfA = specialPropertyOfA; 
    } 
} 

class DerivedB : MyBase 
{ 
    public string SpecialPropertyOfB { get; set; } 
    DerivedA(string specialPropertyOfB) 
    { 
     SpecialPropertyOfB = specialPropertyOfB; 
    } 
} 

私が推測するように、すべてのプロパティを設定して派生クラスを記録したいと思います。しかし、上記の例では、Recordメソッドが呼び出されたときに設定されていないため、派生クラスの特殊なプロパティを記録することはできません。

これを克服する1つの方法は、Recordメソッドprotectedを作成し、これを派生クラスのコンストラクタの最終行と呼びます。しかし、これは私の基本原則に違反しています(派生クラスはすべて、初期化直後に記録する必要があります)。私は設計でこの義歯を作りたい。

これを処理する方法はありますか?

+0

不可:


これを克服する方法

は、ファクトリメソッドを使用しています。これを行うための唯一の方法は、たとえばFactory経由で行うことです。私の場合は、レコード機能が不足しています。クラスがそれ以上のことをするように見えます。 – RvdK

+1

Recordをinterface/abstractとして作成し、それをすべてのDeriveクラスに実装するとどうなりますか? (あなたは記録の中で特別な小道具をどのように使いたいのですか?) –

答えて

1

あなたがしようとしていることをもう一度見てください。

派生クラスのコンストラクタのより前には、基本クラスのコンストラクタはと呼ばれます。

MyBase() 
{ 
    Record(); 
} 

void Record() 
{ 
    Recorder.Process(this); // <-- What is "this" ? 
} 

この時点で、thisの値はどのようになりますか?

インスタンスがまだ構築されていないため、派生クラスのコンストラクタにイベントが呼び出されていないため、thisへの参照がないため、ここでは使用できません。

のインスタンスが完全に構築された後に、このメソッドをと呼びます。

public static class MyBaseFactory 
{ 
    public static MyBase CreateDerivedA() 
    { 
     int specialPropertyOfA = // ... 
     MyBase instance = new DerivedA(specialPropertyOfA); 
     Recorder.Process(instance); 
     return instance; 
    } 

    public static MyBase CreateDerivedB() 
    { 
     string specialPropertyOfB = // ... 
     MyBase instance = new DerivedB(specialPropertyOfA); 
     Recorder.Process(instance); 
     return instance; 
    } 
} 
+0

私はそれが必要なときに「これ」がないことを知っています。しかし、回避策を探していて、基本的にそれを提供しました。ありがとう。 –

関連する問題