nimo23:
Tengo una interfaz
public interface Query {
}
y su aplicación:
public class UserQuery implements Query {
// specific properties to query a user
}
y otra interfaz
public interface Queries{
protected void runQuery(Query q);
}
y su aplicación que hacen uso de ella:
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;
..
}
}
Todas las obras, sin embargo, ¿cómo puedo evitar el elenco en runQuery(Query q)
(Tal vez con runQuery(Query<T> q)
)?
Imagine un conjunto de diferentes implementación de Query
( UserQuery
, StoreQuery
, BalanceQuery
, etc. - con la solución anterior, tengo que hacer un reparto explict en cada reemplazo de métodos, que es un poco incómodo.
¿Hay algo mejor patrón de diseño para este tipo de casos de uso que el anterior?
Mureinik:
Se podría hacer Queries
una interfaz genérica:
public interface Queries<Q extends Query> {
protected void runQuery(Q q);
}
A continuación, UserQueries
puede utilizar un tipo específico Query
:
public class UserQueries implements Queries<UserQuery> {
@Override
protected void runQuery(UserQuery q) {
// q is a UserQuery, no need to cast anything...
}
}