Могу ли я избежать явного приведения с использованием «шаблонов» или более качественных «шаблонов проектирования»? - PullRequest
1 голос
/ 17 мая 2019

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

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 Ответ

5 голосов
/ 17 мая 2019

Вы можете сделать 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...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...