【发布时间】:2019-05-17 20:10:28
【问题描述】:
我有一个界面
public interface Query {
}
及其实现:
public class UserQuery implements Query {
// specific properties to query a user
}
还有另一个界面
public interface Queries{
protected void runQuery(Query q);
}
及其使用它的实现:
public UserQueries extends Queries{
@Override
protected void runQuery(Query q){
// can I avoid this explicit cast with generic type parameters or other design patterns?
// for example Query<UserQuery> ?
var uq = (UserQuery) q;
..
}
}
所有的作品,但是,我怎样才能避免runQuery(Query q) 的演员表(也许runQuery(Query<T> q))?
想象Query 的一组不同实现(UserQuery、StoreQuery、BalanceQuery 等 - 使用上面的解决方案,我必须在每个覆盖方法中进行显式转换,这有点尴尬。
对于上述用例,有没有更好的设计模式?
【问题讨论】:
-
为什么要将
q转换为UserQuery? -
@rgettman 因为我想从 UserQuery 访问属性。
-
在接口
Query中,你必须有一个公共方法,如run,所有类都必须实现。然后,Queries将调用run并且实现必须处理所有事情。如果你在做强制转换,你不需要接口或者应该创建Queries的特定实现来只运行UserQuery -
换一种说法:如果
Queries可以处理普通的Query,但UserQueries不能处理普通的Query,那么UserQueries不应该是@987654345的子类型@,根据 Liskov 替换原则。 (LSP 基本上说一个子类型应该能够做它的父类型所做的一切,还有更多。) -
@nimo23:如果不了解这些对象的更多语义,很难确定,但this answer I wrote for another related question 可能是您的选择。
标签: java generics design-patterns