2011-10-25 8 views
2

にあるかどうかを確認する方法クラスSubがその基本クラスSuperのコンストラクタを呼び出している場合、Superのコンストラクタだけの呼び出しではないことを伝える方法はありますか?あなた自身のコンストラクタ、または基本クラスのコンストラクタがc#

私はディスクからオブジェクトにデータをロードしています。すべてのフィールドがリフレクションを使用してnullでないことを確認したいと思います。しかし、ベースコンストラクタを呼び出す場合、すべてのコンストラクタが終了するまでこれをチェックするのは適切ではありません。例:

class Super 
{ 
    string s; 
    float? f; 
    public Super(List<string> lines) 
    { 
     //initialize s and f based on lines 

     if (notFromSubclassConstructor)) 
     { 
      AssertInitialized(this); 
     } 
    } 

    public static void AssertInitialized(Super super) 
    { 
     // Iterate through every field and make sure it isnt null 
     // I already know how to do this part. If we find a null 
     // field we throw an exception. 
    } 
} 

class Sub : Super 
{ 
    string something; 
    int? somethingElse; 
    public Sub(List<string> lines) 
     : base(lines) //we dont want to AssertInitialized inside here, we arent done yet! 
    { 
     //initialize blah blah 

     if (notFromSubclassConstructor)) 
     { 
      AssertInitialized(this); 
     } 
    } 
} 

私はそれが醜いから来ていることを示す何らかのブール値を渡すことは避けたいと思います。私は何とか反射や他の方法でこれを行うことができますか?代替パラダイムもお勧めします。

+0

反射はブール値よりもはるかに遅くなります。 – Steve

+0

これを最後に行う必要がある場合は、元のクラスのコンストラクタの末尾に配置し、すべての子コンストラクタで最後にbase()を呼び出します。 – James

+0

@Steveどのようにすべてのフィールドをチェックするためにブール値を使用するのですか?ここでの利点は、null可能なフィールドを持つことができ、検証コードを変更する必要がないことです。 – Lucina

答えて

4

階層内の各クラスにそれぞれのフィールドをチェックさせるだけです。例外が基本クラスのコンストラクタでスローされた場合、例外が呼び出し元に直接伝播するため、派生クラスのコンストラクタは実行されません。

これにより、各クラスはそれ自身のデータを管理することができます。これは、時間の経過とともにメンテナンス可能でなければなりません。また、リフレクションに頼るのではなく、初期化を直接チェックすることもできます。これは、高速であるだけでなく、使用や書き込みが簡単であるだけでなく、使用や書き込みが簡単です)。

7

さてあなたはでき使用:

if (GetType() == typeof(Super)) 

オブジェクトの実際の型を決定します。

しかし、実際には私はこのパターンについてどうにも確信していません。 Super.AssertInitializedを作成して、Superのフィールドを確認し、Sub.AssertInitializedフィールドをチェックして、Subのフィールドを確認してください。それらを両方ともプライベートメソッドにして、両方のコンストラクタからそれらを呼び出す。

編集:チェックを明示的に関連フィールドを使用するようにします。ここでの反射を反復しないでください。すべてのフィールドが何であるか知っています。

+0

IMOスティーブはブールを使った彼のコメントでリフレクションよりも言いましたが、この場合反射はスパゲッティコーディングを引き起こす可能性があります。 –

+0

@SaeedAmiri:はい、私は後の段落でそれを得ようとしていました。明確にするために編集します。 –

+0

@JonSkeetフィールドをチェックするだけではない理由は、チェックコードを変更せずにフィールドを追加/削除できるようにするためです。 – Lucina

1

まあ、オブジェクトを構成するFactoryを追加し、そのデータをチェックします。 IMHOは最も明確な解決策です。

関連する問題