0

すでに 2 つのクラスが定義されています。これらDogActivityTypeを and と呼びますHorseActivityType。それらは同じフィールド、同じメソッドを持ちますが、データベース内の 2 つの異なるテーブルに書き込み、もちろん異なる名前が付けられます。

すべてのビジネス ルールが 1 つのクラスで既に機能している関数があり、他のクラスは同じビジネス ルールを使用しています。

制限:

  1. これらの 2 つのクラスは、プロジェクトの他の部分で使用されるため、使用する必要があります。
  2. 1 つのクラスを作成して別の列 (フィールド) を追加して、両方のタイプのクラスを区別することはできません。
  3. これら 2 つのクラスのソースを編集できません。

. コードの簡略化されたバージョンは次のとおりです。

public doAllCalculations(){
  // retrieve collection
  foreach (DogActivityType activity in allActivities){
    // a lot of code here

    // more code... 

    createMoreOf(activity);  // this is overloaded since it needs to know which DB to write to
  }
}

// using overload for same function name
private createMoreOf(DogActivityType doggyActivity){
    /// do some specific when it is a dog
}

private createMoreOf(HorseActivityType horse){
    /// do some specific when it is a horse
}

さて、問題は次のとおりdoAllCalculations()です。非常に広範で複雑であり、開発の過程で変更される可能性があります。同じ分析を行うために2 つの異なる関数 (doAllCalculationsDOG()と) を使用したくありません。1 つは に、もう 1 つはクラスに必要だからです。ある日、プロジェクトの誰かが両方の機能を更新するのを忘れたり、その他の悪いシナリオが発生する可能性があります...doAllCalculationsHORSE()DogHorse

したがって、両方のクラスに同じ関数を使用したいと考えています。したがって、大きな計算関数でルールを編集すると、両方のクラスで機能することがわかります。私は次のようなもので終わると思っています:

public class AnimalActityType {

}

public doAllCalculations(){
  // retrieve collection
  foreach (AnimalActivityType activity in allActivities){
    // a lot of code here
    // more code... 
    createMoreOf(activity); 
  }
}

AnimalActityTypeは抽象的な親をシミュレートします。私はこれを逆ポリモーフィズムと呼びます...しかし、DogActivityType と HorseActivityType はこの親についてどのように知るのでしょうか? 親を強制することはできますか?出来ますか?何か案は?

4

2 に答える 2

4

これら2つのクラスのソースを編集できません。

これが基本クラスや私へのインターフェースさえも作成できないことを意味すると仮定すると、これは、解決策を考え出したとしても、それは厄介なハック作業に他ならないことを意味します。私は、この自己課された制限を回避する方法を、変質した形のポリモーフィズムを思い付くよりも早く見つけようとします。

于 2013-01-24T02:20:16.190 に答える
1

デコレータパターンを使用することもできますが、非常に珍しい方法です。

    class Decorator
{
    private object instance;

    public Decprator(object instance)
    {
         this.instance = instance;
    }

    public <type> SomeCommonProp
    {
      get{
        if(instance is DogActivityType)
        {
          return (instance as DogActivityType).SomeValueOrPropertyOrCall;
        }
        else
        {
          return (instance as HorseActivityType).SomeValueOrPropertyOrCall; 
        }
      }
    }
}


class MyCalculations
{
  private Decorator instance;

  public MyCalculations(Decorator inst)
  {
      instance = inst;
  }

  public <type> SomeCalculationMethod()
  {
    // here you will use instance.SomeCommonProp for your calculations
  }
}
于 2013-01-24T06:15:29.627 に答える