2

那里存在interface Algorithm

存在class MathAlgorythm implements Algorithm (returns MathResult, which implements Result)

存在class ChemitryAlgorythm implements Algorithm (returns ChemitryResult, which implements Result)

此外,还有一个Context class,用于将数据传递给这些算法。数据通过以下方式传递:

public Result executeStrategy(Data data) {
    return algo.execute(data);
}

假设我,executeStrategy 并回来 return MathAlgorithm.execute(data);我得到了 Result 类型的东西,对吗?

然后我再次执行 return ChemitryAlgorithm.execute(data);我得到一些结果

问题: 结果是一个接口。我需要访问作为 MathResult 或 ChemistryResult 的具体类实现。换句话说。一旦我得到结果类型的东西,我需要更深入地挖掘并知道隐藏在接口后面的类

我希望这种漫谈不会太混乱。

感谢您阅读和回复

4

4 回答 4

2

如果您给出Result一个T get()具体实现必须实现的方法,那么您不需要了解具体实现。

于 2010-12-29T23:51:36.120 回答
0

不确定我是否理解您的问题,但要知道实例的具体类,您可以使用 getClass() 或使用 instanceof 检查它是否为 MathResult 等。请注意不要破坏实现 Result 接口的全部意义。

于 2010-12-29T23:56:33.483 回答
0

确保您的 Result 接口足够强大,可以满足所有客户端。这是不破坏多态透明度的关键。

如果你真的、真的真的需要知道具体的类型,你可以使用 getClass、某种唯一 ID 和 getter,或者(最好)将行为吸收到具体 Result 类的操作中。

于 2010-12-30T00:02:13.577 回答
0

怎么样:

interface Algorithm<R extends Result, D extends Data> {
  T execute data(D data);
}

然后您的 MathAlgorithm 实现将如下所示:

class MathAlgorithm implements Algorithm<MathResult, MathData> {
  public MathResult execute(MathData data) {
    // do whatever
    return <instance of MathResult>;
  }
}

用法:

MathResult mathResult = new MathAlgorithm().execute(someMathData);
于 2010-12-30T00:17:05.200 回答