すでに 2 つのクラスが定義されています。これらDogActivityType
を and と呼びますHorseActivityType
。それらは同じフィールド、同じメソッドを持ちますが、データベース内の 2 つの異なるテーブルに書き込み、もちろん異なる名前が付けられます。
すべてのビジネス ルールが 1 つのクラスで既に機能している関数があり、他のクラスは同じビジネス ルールを使用しています。
制限:
- これらの 2 つのクラスは、プロジェクトの他の部分で使用されるため、使用する必要があります。
- 1 つのクラスを作成して別の列 (フィールド) を追加して、両方のタイプのクラスを区別することはできません。
- これら 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()
Dog
Horse
したがって、両方のクラスに同じ関数を使用したいと考えています。したがって、大きな計算関数でルールを編集すると、両方のクラスで機能することがわかります。私は次のようなもので終わると思っています:
public class AnimalActityType {
}
public doAllCalculations(){
// retrieve collection
foreach (AnimalActivityType activity in allActivities){
// a lot of code here
// more code...
createMoreOf(activity);
}
}
AnimalActityType
は抽象的な親をシミュレートします。私はこれを逆ポリモーフィズムと呼びます...しかし、DogActivityType と HorseActivityType はこの親についてどのように知るのでしょうか? 親を強制することはできますか?出来ますか?何か案は?