0

すべての一般的な関数が記述されている基本クラスがあります。この関数を virtual キーワードでオーバーライドする多くのクラスがあります。お気に入り、

public class Base
{
   public virtual void sample()
   {
     ..............
   }
}

public class a : Base
{
   public override sample()
   {

   }
}

public class implement
{

   public void ToSample()
   {
     Base baseclass = new Base();

     Switch(test)
     {
        case a: baseclass = a();
         break;

        case b: baseclass = b();
        break; 
     }

    baseclass.sample();
   }

}

これは現在の状況に最適なコードですが、スイッチケースで割り当てるクラスが増えました。大量のケースを追加するのは良い習慣ではないので、子クラスを自動的に割り当てるものが必要です。

誰かが実装するものを知っていますか?

4

1 に答える 1

0

コメントに記載されているように、依存性注入を使用して実装を分離できます。ただし、場合によっては、そのような切り替えを行う以外に選択肢がないことに注意してください (たとえば、ソケットで受信したテキストに基づいてクラスを作成する必要がある場合)。そのような場合、重要なことは、switch ステートメントを常に 1 つのメソッドにカプセル化して、オブジェクトがそれに依存するようにすることです (つまり、どこにでもコピー アンド ペーストしないでください :))。ここでの考え方は、システムを潜在的に有害なコードから隔離しておくことです。もちろん、新しいクラスを追加する場合は、そのメソッドを変更する必要がありますが、それを行う必要があるのは 1 回だけ、特定の 1 か所だけです。

私が見た (そして時々使用した) 別のアプローチは、値とクラスの間のマッピングを構築することです。したがって、クラス作成スイッチが整数コードに依存している場合は、基本的にコードとクラスの間のマッピングを作成します。ここで行っているのは、「静的な」スイッチを動的な動作に変えることです。これは、マッピングの内容をいつでも変更して、プログラムの動作を変更できるためです。典型的な実装は次のようになります (疑似コードで申し訳ありません。私は C# に詳しくありません)。

public class implement
{

   public void ToSample()
   {
     class = this.mapping.valueForKey(test);
     Base baseclass = new class();
     baseclass.sample();
   }
}

ただし、この例を機能させるには、使用している言語によって異なるリフレクションのサポートが必要であることに注意してください (繰り返しますが、C# の仕様はわかりません)。

最後に、オブジェクト作成の問題とそれらを解決するいくつかのよく知られた形式に関するインスピレーションを得るために、パターンの作成ファミリを確認することもできます。

HTH

于 2013-02-25T11:35:10.433 に答える