0

コンストラクターメソッドでオブジェクトの作成を拒否する方法はありますか?

私のポイントは、条件に関連する追加のパラメーターを設定することです。例えば:

public Test(Rule rule){
    if(rule == Rule.Custom)
        //DO NOT CREATE
    else{
        this.rule = rule;
    }
}

//WORK IF rule IS Custom
//I want to pass this information to user
public Test(Rule rule, string extra){
    if(rule != Rule.Custom)
        //DO NOT CREATE
    else{
        this.rule = rule;
        this.extra = extra;
    }
}

ファクトリメソッドを作成できるかもしれませんが、回避策について知りたいです。

4

3 に答える 3

2

このパターンはArgumentOutOfRangeExceptionを使用する必要があるようです。

サンプル コードを変更して、このアイデアを示します。

public Test(Rule rule)
{
    if (rule == Rule.Custom)
    {
        throw new ArgumentOutOfRangeException("rule", "A custom rule is not allowed");
    }

    this.rule = rule;
}

public Test(Rule rule, string extra)
{
    if (rule != Rule.Custom)
    {
        throw new ArgumentOutOfRangeException("rule", "Only a custom rule is allowed");
    }

    this.rule = rule;
    this.extra = extra;
}

C++ のバックグラウンドを持つ私は、以前はアサーションを使用していた可能性がある場所で、ますます引数の例外を使用していることに気づきました。

お役に立てれば、

ps コンストラクターからスローされた例外は完全に受け入れられます...

于 2012-04-15T23:55:59.123 に答える
2

目的が例外をスローすることではなく、オブジェクトを作成しないことである場合、ファクトリ メソッドが唯一の現実的なオプションですこれには 2 つのモデルがあります。

  1. 条件が満たされない場合は null を返します。
  2. bool TryCreate(parameters ..., out Result)成功または失敗を示すブール値が呼び出しに返される署名を使用します。

もちろん、これらの実際の問題は、オブジェクトの作成が失敗した理由を呼び出し元が知ることができず、詳細について帯域外の情報 (ドキュメント) を参照する必要があることです。

于 2012-04-16T00:07:28.940 に答える
1

例外をスローできます。これにより、オブジェクトの作成が中止され、呼び出し元にエラーが通知されます。

public Test(Rule rule){ 
  if(rule == Rule.Custom) 
    throw new WillNotCreateException();
  else{ 
    this.rule = rule; 
  } 
} 

WillNotCreateExceptionカスタム例外タイプまたは一般的な例外タイプのいずれかです (例: System.ArgumentException)

于 2012-04-15T23:54:19.613 に答える