2017-06-11 5 views
1

私のコンストラクタにはいくつかの条件があります。パラメータがそれらの条件に合格しない場合は、代わりに別のオーバーロードされたコンストラクタを使用したいと思います。これは可能ですか?コンストラクタ内の別のコンストラクタに変更することはできますか?

例コード:

public Header(byte[] givenData, Utilities.FileType defaultingFileType) 
{ 
    int index = -1; 
    if (givenData != null) 
    { 
     // possibly alter int index here 
    } 
    if (index != -1) 
    { 
     // found match, parse givenData 
    } 
    else 
    { 
     // no suitable match found, default to given file type 
     this = Header(defaultingFileType); 
    } 
    // etc. 
} 

ライン:

this = Header(defaultingFileType); 

は別のコンストラクタに変更するには、私のことは不可能試みです。この時点で、私はどのようにして別のコンストラクタに変更できますか?別のコンストラクタに変更できない場合、その時点で他のコンストラクタのコードをこのコンストラクタにコピー/ペーストする必要があります。その時点で代わりに使用したいコンストラクタは次のとおりです。

public Header(Utilities.FileType givenFileType){} 
+0

いいえ。次の質問ください。 –

+0

これはクラスか構造体ですか?構造体はこれに割り当てることができますが、クラスではできません。 –

+0

@mikezこれはクラスです。 – Sparky

答えて

2

あなたは別のコンストラクタによってコンストラクタを呼び出すことはできませんが、このソリューションのいずれかを使用できます。 1.静的メソッドを作成して、コンストラクタを実行します。

public class Class1 
{ 
public Class1() 
{ 
} 
public Class1(param1) 
{ 
} 
public Class1(param1,param2) 
{ 
} 
public Class1(param1,param2,param3) 
{ 
} 
public static Class1 GetNew(param1,param2,param3) 
{ 
    if(param1 != null && param2!= null && param3!= null) 
    { 
    return new Class1(param1,param2,param3); 
    } 
    else if(param1 != null && param2!= null && param3== null) 
    { 
    return new Class1(param1,param2); 
    } 
    else if(param1 != null && param2 == null && param3== null) 
    { 
    return new Class1(param1); 
    } 
    else 
    { 
    return new Class1(); 
    } 

} 
} 

1つのコンストラクタを2-使用し、メソッドを作成します。

public class Class2 
{ 
public Class1(param1,param2,param3) 
{ 
    if(param1 != null && param2!= null && param3!= null) 
    { 
    Method1(param1,param2,param3); 
    } 
    else if(param1 != null && param2!= null && param3== null) 
    { 
    Method1(param1,param2); 
    } 
    else if(param1 != null && param2 == null && param3== null) 
    { 
    Method1(param1); 
    } 
    else 
    { 
    Method1(); 
    } 
} 
public void Method1(param1,param2,param3) 
{ 
} 
public void Method1(param1,param2) 
{ 
} 
public void Method1(param1) 
{ 
} 
public void Method1() 
{ 
} 
} 
+0

私は第2のアプローチと、コメントが推奨したものが、私のコーディング手法に最もよくマッチするものだと思います。ありがとう。 – Sparky

1

コンストラクタの本体内から別のコンストラクタに切り替えることはできません。これが必要な場合は、プライベートコンストラクタに切り替えて静的メソッドを使用してコンストラクタを呼び出すか、ファクトリパターンを使用するのが最善の方法です。

0

あなただけのデフォルト値を使用したい場合は、そのような構文を使用することができます:

public Header(byte[] givenData, Utilities.FileType defaultingFileType = [DEFAULT_VALUE]) 
{ 
... 
} 

これが唯一の.NET 3.5から動作し、デフォルト値は定数でなければなりません。

これが不十分な場合は、これを解決する最善の方法は、このクラスのインスタンスを作成するために使用される静的メソッドです。クラスの不適切な使用を避けたい場合は、コンストラクタをprivateに設定することもできます。

さらに、条件が対象とするフィールドを処理するいくつかのプライベート関数を作成することもできます。次に、毎回異なるパラメータでこの関数を呼び出します。

+0

明快にするために、 'byte [] givenData'が無効な場合、' defaultingFileType'を使用してオブジェクトを構築します。これは、 "うまくいかなかった場合、この値でデフォルトのコンストラクタを使用するだけです代わりに。これは 'Header(defaultingFileType)'です。静的メソッドを使用してオブジェクトのプロパティを設定することは可能ですか? – Sparky

関連する問題