介绍:
我为数据库过滤器构建了一个类层次结构:
class Filter {
}
class PropertyFilter<T> extends Filter {
Boolean exists;
T equal;
}
class ComparableFilter<T> extends PropertyFilter<T> {
T greaterThan;
T lessThan;
}
这样我可以PropertyFilter<String>
用于字符串和ComparableFilter<DateTime>
DateTime 对象。
棘手的部分:
我有一些过滤器查询构建器,它遵循与过滤器类相同的层次结构。查询构建器的每一方都应该只添加额外的查询。
例子:
class FilterQueryBuilder<T extends Filter> {
protected final T filter;
public FilterQueryBuilder(T filter) {
this.filter = filter;
}
public Query getQuery() {
return new Query();
}
}
class PropertyFilterQueryBuilder<T extends PropertyFilter<?>> extends FilterQueryBuilder<T> {
public PropertyFilterQueryBuilder(T filter) {
super(filter);
}
public Query getQuery() {
Query query = super.getQuery();
if(filter.exists != null) addExistsQuery(query, filter.exists);
if(filter.equal != null) addEqualQuery(query, filter.equal);
return query;
}
}
class ComparableFilterQueryBuilder<T extends ComparableFilter<?>> extends PropertyFilterQueryBuilder<T> {
public ComparableFilterQueryBuilder(T filter) {
super(filter);
}
public Query getQuery() {
Query query = super.getQuery();
if(filter.greaterThan != null) addGreaterThanQuery(query, filter.greaterThan);
if(filter.lessThan != null) addLessThanQuery(query, filter.lessThan);
return query;
}
}
问题/问题:
如您所见,我总是必须调用super.getQuery()
然后返回修改后的查询对象。
如果每个类只有一个这样的方法会容易得多addFiltersToQuery
:
addFiltersToQuery() {
if(filter.x != null) addXQuery(query, filter.x);
if(filter.y != null) addYQuery(query, filter.y);
}
但是我当然会用我的类层次结构覆盖这个方法。虽然如果我addFiltersToQuery
在FilterQueryBuilder
课堂上打电话,我只会得到最新的实现。
有没有办法在不使用的情况下调用所有实现super
?