【问题标题】:Class with dynamic methods具有动态方法的类
【发布时间】:2013-10-29 00:43:29
【问题描述】:

我对自己的想法的构想仍有一些问题。

问题在于,我们想创建一个 A 类,它可以根据系统配置改变其属性和方法,并且可以动态改变。

简单地说,我可以有一个具有属性 X、Y 且仅具有 add 方法的类“A1”和另一个具有 X、Y、Z 和方法加减法的类“A2”。并且可能会将它们包含在系统中。

但想法是“A”类或更好的类 A 的对象可以动态更改为两个接收方法之一。

我考虑过使用策略模式,因为我可以动态更改,但是我卡住了不能动态添加的功能,并且我阅读了一些关于抽象工厂和工厂模式的信息,它“几乎”满足了我的需求。但我认为是因为我的例子不是很清楚。

我开始想象这个类将是他们自己的抽象工厂,但这仍然给我留下了疑问和他们的新方法。

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

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

示例:

 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;

 }

【问题讨论】:

  • 是的,在 C# 中您可以使用动态和通用接口。在java中虽然我只知道你可以使用通用接口。
  • ...使用哪种编程语言?
  • 它与特定语言并不完全相关,而是一种“结构化解决方案”,便于从同一个类开始访问数据。

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


【解决方案1】:

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

需要的是工厂或抽象工厂模式,我想。您必须弄清楚所有可能情况的通用接口是什么(因为如果函数可以返回 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]);
  }
}

【讨论】:

  • 它与特定语言并不完全相关,而是一种“结构化解决方案”,便于从同一个类开始访问数据。我的想法并根据系统配置更改“类”。非常感谢,但我想我已经弄清楚如何实现我的想法了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多