0

DogActivityType我有 2 个已经定义的类,我们将它们称为HorseActivityType. 它们具有相同的字段、相同的方法,但它们写入数据库中的 2 个不同的表,当然,它们的名称也不同。

我有一个函数,其中一个类的所有业务规则都已经工作,而另一个类使用相同的业务规则。

限制:

  1. 我必须使用这两个类,因为它们在项目的其他部分中使用
  2. 我无法创建一个类并添加另一列(字段)来区分这两种类型的类。
  3. 我无法编辑这两个类的源代码。

. 这是我的简化版代码:

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()and doAllCalculationsHORSE()) 来进行相同的分析,只是因为我需要一个用于the 类Dog,另一个用于Horse该类。有一天,项目中的某个人可能会忘记更新这两个功能或任何其他糟糕的情况......

所以,我想对这两个类使用相同的功能。所以如果我在大计算函数中编辑一个规则,我会知道它对两个类都有效。我想我最终会得到这样的结果:

public class AnimalActityType {

}

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

AnimalActityType会模拟一个抽象的父级,我称之为反向多态......但是 DogActityType 和 HorseActityType 是如何知道这个父级的呢?我可以强迫父母吗?是否可以?有任何想法吗?

4

2 回答 2

4

我无法编辑这两个类的源代码。

假设这意味着你不能为我创建一个基类甚至一个接口,这说明即使你想出了一个解决方案,它也只不过是一个凌乱的黑客工作。我宁愿想办法绕过这种自我强加的限制,也不愿想出一些变态的多态形式。

于 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 回答