У меня есть интерфейс
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
и т. Д.) - с решением, приведенным выше, я должен выполнить приведение объяснения в каждом переопределяющем методе, что немного неудобно.
Есть ли лучший дизайн-шаблон для таких случаев использования, как указано выше?
Всего 1 ответ
Вы можете сделать 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...
}
}