2

コーディングの練習について質問があります。初期化できないクラスを作成したい。3つのオプションがあると思います:

  • 抽象修飾子
  • 静的修飾子
  • プライベート コンストラクター

すべてのプロパティとメソッドに 'static' という名前を付けなければならないという理由だけで、静的クラスを作成したくありません。見た目が煩雑です (そして、'this' キーワードを使用できません)。

MSDNによると:

クラス宣言で抽象修飾子を使用して、クラスが他のクラスの基本クラスであることのみを意図していることを示します。

編集このクラスから継承するものはありません。

ただし、それは解決策になります(ただし、この状況で使用するのは間違っているようです)。

または、プライベート コンストラクターを作成して、クラスを初期化できないようにすることもできます。

これが理由の理由を説明するのに役立つ場合: クラスは、ワークフロー プロセスを開始する責任があります。何も返されないため、初期化する必要はありません。「開始」するだけで済みます。

デモコード

class Program
{
    static void Main(string[] args)
    {
        WorkFlow wf = new WorkFlow(); // this will error which is fine!
        ComplexObject co = new ComplexObject();
        WorkFlow.Begin(co);
        Console.ReadKey();
    }
}

public class WorkFlow 
{
    private WorkFlow()
    {
        //private to prevent initialization but this feels wrong! 
    }

    public static void Begin(ComplexObject co)
    {
        //code to begin the workflow
    }
}
4

8 に答える 8

4

初期化できないクラスを作成したい。

これにより、可能な使用法が残ります。静的または基本クラスのみです。

クラスがから派生する場合は、を使用しますabstract。この状況では、プライベート/保護されたコンストラクターはハックになります。

サンプル コードはstaticクラスのように見えます。代わりにシングルトンを使用。

于 2012-09-17T12:04:40.647 に答える
3

グッド プラクティス: プライベート コンストラクター (たとえば、 Factoryパターンを使用する場合、少なくともGOFブックで推奨されているものです)。それが基本クラスである場合は、abstract を使用することをお勧めします (それが名前の意味です)。

于 2012-09-17T12:04:57.983 に答える
3

行ったことだけを実行し、Begin メソッドをファクトリとして使用してワークフローを作成するのはどうでしょうか。

var workflow = Workflow.Begin(complexObject); 

public class WorkFlow  
{ 
    private WorkFlow() 
    { 
        //private to prevent initialization but this feels wrong!  
    } 

    public static WorkFlow Begin(ComplexObject co) 
    { 
        return new Workflow(co);
    } 
}
于 2012-09-17T12:08:36.943 に答える
2

シングルトンが必要なようです。

ここでより多くの参照:

http://msdn.microsoft.com/en-us/library/ff650849.aspx

ideeaが気に入らない場合は、抽象クラスが最適です。これは、インスタンス化したくないと言ったので、抽象クラスがまさにそれを実行することを忘れないでください。プライベートコンストラクターを使用してみてください。

于 2012-09-17T12:05:29.523 に答える
2

クラスが厳密に基本クラスとして使用されている場合、それは私のためでなければなりabstractません。

あなたの更新に基づいて、静的クラスとメソッドに行きます。

WorkFlow.Begin(co);

ただし、これを行いたくないので、1つのオプションしか残らないと思います...プライベートコンストラクター。

于 2012-09-17T12:04:22.130 に答える
1

クラスを「開始」する必要がある場合は、初期化する必要があります(使用するのが静的メソッドだけである場合を除く)。
抽象クラスは、実装の一部(またはすべて)をサブクラスに任せるために使用され、説明によっては適切ではありません。
「静的クラス」-ここでは特別な利益はないと思います(あなたの場合)。
プライベートコンストラクター-クラスをインスタンス化できるユーザーを制限するために使用されます。
これらのいずれかがデザインに一致するかどうかはわかりませんが、本当にシングルトンが必要だと思います。調べてみてください。これが最も一般的で基本的なデザインパターンです。
ところで-私は最後の手段としてのみシングルトンを使用します。通常、クラスが何らかの非共有リソースを制御している場合です。

于 2012-09-17T12:14:11.017 に答える
1

すべてのプロパティとメソッドに 'static' という名前を付けなければならないという理由だけで、静的クラスを作成したくありません。見た目が煩雑です (そして、'this' キーワードを使用できません)。

ctor を作成するかprivate、 class を作成しstaticます。呼び出し元がクラスのメソッドとプロパティにアクセスできる唯一の方法 (呼び出し元が派生クラスでない場合) は、public staticメンバーを介することです。

継承チェーンの柔軟性が向上しますが、「静的メンバーをprivate ctor回避する」シナリオではあまり役に立ちません。

于 2012-09-17T12:08:55.713 に答える
1

私はプライベートコンストラクターを好みます。つまり、シングルトンパターンと同じです

情報

コーディング

プライベートコンストラクターは、要件に適したアプローチのようです。抽象も良いですが、抽象よりもプライベートコンストラクタが便利です。しかし、その情報を拡張したい場合は、abstract を使用することをお勧めします。

于 2012-09-17T12:09:07.760 に答える