具有动态方法的类

时间:2013-10-29 00:43:29

标签: design-patterns dynamic methods interface return-type

我对一个想法的概念仍然有些麻烦。

问题是,这需要创建一个类A,它可以改变它的属性和方法,可以动态地改变系统配置。

简单地说,我可以使用属性X,Y的类“A1”,只使用add方法,使用X,Y,Z的另一个类“A2”以及方法加减。并且可能会将它们放在系统中。

但是我们的想法是,类A“A”或更好的类A的对象可以动态地改变为两个recebebdo中的一个方法。

我考虑过使用策略模式,因为我可以动态更改,但是我坚持了无法动态添加的功能,而且我读了一些关于抽象工厂和工厂模式的内容,它“几乎”满足了我的需求。但我认为这是因为我的例子不是很清楚。

我想象的是,这个班级将是他们自己的抽象工厂,但这仍然让我怀疑和他们的新方法。

它不是针对特定的语言,而是我的思维和系统的易用性,而无需在代码中管理和使用多个类,它将是实际类的接口。

最大的问题是:有可能吗?我该怎么办?

例:

 class System
 {
setConfig(Config.VALUE);
 }

 class A 
 {
if(system.config == Config.A1)
{
    this.handleClass = new A1();
}
else
{
    this.handleClass = new A2();
}
 }

 class A1
 {
add(value:float);
 }

 class A1
 {
subtract(value:float);
 }

 main
 {
System system.setConfig(Config.A);
A foo = new A();

A.add() // because the add method belongs to class A1;

System system.setConfig(Config.B);

A.subtract() // because the add method belongs to class A2;

 }

1 个答案:

答案 0 :(得分:0)

语言不明显。在大多数语言(C ++,C#,Java)中,您将返回特定类型;即使这是“通用”类型,如 void * 对象,您通常必须知道在编译时可以和不能调用哪些方法。解决方法是可行的,但在您的情况下,可能不需要它们。

我认为需要的是工厂或抽象工厂模式。您必须弄清楚所有可能情况的通用接口是什么(因为如果函数可以返回int或数组,则无法添加返回值,也无法获取其元素)并在不同的类中实现此接口。然后,无论何时需要创建接口实例,都要求Factory执行此操作,而Factory选择它应该是哪个类。

interface ISampleValues{
  public abstract int NumberOfValues();
  public abstract int SpecificValue(int index);
}

class SingleValue : ISampleValues {
  private int m_value;
  public SingleValue(int val) {m_value = val;}
  public override int NumberOfValues() {return 1;}
  public override int SpecificValue(int index) {return m_value;}
}

class ArrayOfValues : ISampleValues {
  private int[] m_values;
  public ArrayOfValues(int[] arr) {m_values = arr.Clone();}
  public override int NumberOfValues() {return m_values.Length;}
  public override int SpecificValue(int index) {return m_values[index];}
}

class ValuesFabric {
  public ISampleValues GetValues() {
    if(System.Config.Multiple)
      return new ArrayOfValues(System.Config.ValuesArray);
    else 
      return new SingleValue(System.Config.ValuesArray[0]);
  }
}