题
存在的不可变强>类:
Scope<Cmp extends Comparable<Cmp>>
public Scope<Cmp> crop(Scope<Cmp> scope) {
...
return new Scope<Cmp>(starts, ends);
}
它的许多强>类似的方法是通过扩展:
Timerange extends Scope<Date>
和许多强>他人(也不可变的)。
像他们标识返回其类型的对象。例如:
timerange.crop(scope)
应该返回TIMERANGE对象,而不是范围。
我必须重写每个方法(或使用反射)? 是否有这样做的另一种方式?
在预先感谢 艾格。
解决方案
您需要某种工厂。在这种情况下工厂方法工作得很好。
public abstract class Scope<E extends Comparable<E>> {
abstract Scope<E> create(E start, E end);
public Scope<E> crop(Scope<E> scope) {
...
return create(starts, ends);
}
}
public TimeRange extends Scope<Date> {
Scope<Date> create(Date start, Date end) {
return new TimeRange (...);
}
}
您可能需要一个通用的“这个”参数添加到基类:
public abstract class Scope<THIS extends Scope<THIS, E>, E extend Comparable<E>> {
abstract THIS create(E start, E end);
public THIS crop(Scope<E> scope) {
...
return create(starts, ends);
}
}
public TimeRange extends Scope<TimeRange,Date> {
TimeRange create(Date start, Date end) {
return new TimeRange (...);
}
}
这确实增加额外的工作来在客户端的代码。
其他提示
您可以尝试以下方法:
class Scope<Cpm extends Comparable<Cpm>, Derived extends Scope<Cpm, Derived>> {
public Derived crop(Scope<Cmp, Derived> scope)
}
TIMERANGE将被定义为
class TimeRange extends Scope<Date, Timerange>
和如此crop
将返回TIMERANGE对象。当派生类未定义,可以使用通用的通配符(Scope<Date, ?>
)
Java没有自我型的回报,所以一般需要手动覆盖每一个方法。请参见我对“自我型” 博客一些可能的替代方案的讨论。
你真的需要Timerange
?它不提供任何不仅仅是Scope<Date>
?如果没有,那么只需要使用Scope<Date>
。
另一项建议是,也许,而是采用的构造实例,则可以克隆对象,然后适当地修改的字段为新对象。其原因是,克隆对象是同一类型与原始
Scope<Cmp extends Comparable<Cmp>> implements Cloneable
public Scope<Cmp> crop(Scope<Cmp> scope) {
...
Scope<Cmp> result = (Scope<Cmp>)super.clone();
result.init(starts, ends); // sets the fields for a cloned object
// init() could be private
return result;
}
不隶属于 StackOverflow