Могу ли я избежать явного приведения с «шаблонами» или лучшими «шаблонами проектирования»?

У меня есть интерфейс

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...
    }
}

Есть идеи?

10000