繁体   English   中英

我可以避免使用“泛型”或更好的“设计模式”进行显式转换吗?

[英]Can I avoid explicit cast with “generics” or better “design patterns”?

我有一个界面

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)也许与runQuery(Query<T> q) )?

想象一下Query一组不同实现( UserQueryStoreQueryBalanceQuery等等),使用上述解决方案,我必须对每种覆盖方法进行显式转换,这有点尴尬。

对于上述用例,是否有更好的设计模式?

您可以使Queries成为通用接口:

public interface Queries<Q extends Query> {

    protected void runQuery(Q q);
}

然后, UserQueries可以使用特定类型的Query

public class UserQueries implements Queries<UserQuery> {

    @Override
    protected void runQuery(UserQuery q) {
        // q is a UserQuery, no need to cast anything...
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM