强制客户端在扩展外部类时提供内部类的实现
Force client to provide implementation of an innerclass when extending an outerclass
我想知道是否可以强制客户在定义外部 class 的新实现时提供内部 class 的实现。
为了更好地解释情况:我有一个摘要 class
public abstract class ImmutablePolynomial implements Iterable {
protected int degree;
static ImmutablePolynomial sum(ImmutablePolynomial x, ImmutablePolynomial y) {
.... Some Implementation using an iterator over terms and a return statement....
}
public abstract TermIterator iterator();
Here I want an innerclass (TermIterator) extending Iterator that must be implemented
if you extend ImmutablePolynomial.
现在客户端可以提供 ImmutablePolynomial 的实现,使用特定的数据结构来减少内存使用,例如通过扩展 class。
我如何强制客户端也提供 Innerclass Implementing Iterator 的实现,以便 ImmutablePolynomial 中的静态方法 sum 也适用于客户端提供的实现?
此外,如果这是个坏主意/反模式/有更好的选择,请告诉我。我这样做是为了改进我的编码。
编辑 1:删除字段
protected Collection terms
,正如评论中所建议的那样。
编辑 2:制作方法
iterator()
按照评论中的建议进行摘要
鉴于 ImmutablePolynomial
class 是抽象的,因此您永远不会拥有 class 为 ImmutablePolynomial
的对象,并且您不需要实例ImmutablePolynomial
的子class 使用 class ImmutablePolynomial.TermIterator
,什么时候使用 ImmutablePolynomial.TermIterator
?将其实现为内部 class.
毫无意义
正如@Tassos 在评论中建议的那样,将 TermIterator
声明为接口;这可以嵌套在 class ImmutablePolynomial
中,也可以不嵌套,这取决于您的喜好。也使 ImmutablePolynomial.iterator()
抽象。
如果您在 ImmutablePolynomial
中有任何依赖迭代器的具体方法,请根据接口而不是针对任何特定实现来实现它们。无论如何,当您不仅允许而且要求 subclasses 提供它们自己的实现时,这是唯一明智的方法。
我想知道是否可以强制客户在定义外部 class 的新实现时提供内部 class 的实现。
为了更好地解释情况:我有一个摘要 class
public abstract class ImmutablePolynomial implements Iterable {
protected int degree;
static ImmutablePolynomial sum(ImmutablePolynomial x, ImmutablePolynomial y) {
.... Some Implementation using an iterator over terms and a return statement....
}
public abstract TermIterator iterator();
Here I want an innerclass (TermIterator) extending Iterator that must be implemented
if you extend ImmutablePolynomial.
现在客户端可以提供 ImmutablePolynomial 的实现,使用特定的数据结构来减少内存使用,例如通过扩展 class。 我如何强制客户端也提供 Innerclass Implementing Iterator 的实现,以便 ImmutablePolynomial 中的静态方法 sum 也适用于客户端提供的实现?
此外,如果这是个坏主意/反模式/有更好的选择,请告诉我。我这样做是为了改进我的编码。
编辑 1:删除字段
protected Collection terms
,正如评论中所建议的那样。 编辑 2:制作方法
iterator()
按照评论中的建议进行摘要
鉴于 ImmutablePolynomial
class 是抽象的,因此您永远不会拥有 class 为 ImmutablePolynomial
的对象,并且您不需要实例ImmutablePolynomial
的子class 使用 class ImmutablePolynomial.TermIterator
,什么时候使用 ImmutablePolynomial.TermIterator
?将其实现为内部 class.
正如@Tassos 在评论中建议的那样,将 TermIterator
声明为接口;这可以嵌套在 class ImmutablePolynomial
中,也可以不嵌套,这取决于您的喜好。也使 ImmutablePolynomial.iterator()
抽象。
如果您在 ImmutablePolynomial
中有任何依赖迭代器的具体方法,请根据接口而不是针对任何特定实现来实现它们。无论如何,当您不仅允许而且要求 subclasses 提供它们自己的实现时,这是唯一明智的方法。