@tester2019-2020

Как правильно связывать между собой разные интерфейсы?

Подскажите как правильно реализовывать подобные задачи?

Для простоты приведу такой пример:
Есть два самодостаточных интерфейса
interface Collection {}
interface Grid {}


Есть некотрая реализация каждого из них
class PeopleCollection implements Collection {}
class PeopleGrid implements Grid {}


Класс PeopleGrid выводит данные о People, PeopleCollection содержит в себе эти данные, но структура полей в этих классах отличается. Чтобы связать их между собой решил добавить интерфейс и также некоторую реализацию
interface GridAdapter {
	void setGrid(Grid g);
	void setCollection(Collection c);
	void prepareCollectionToGrid();
}

class PeopleGridAdapter implements GridAdapter {}


Т.о. получаю что для меня-то (ну и по названиям))) понятно что PeopleGridAdapter должен взаимодействовать с PeopleGrid и PeopleCollection, но если я к примеру добавлю реализацию CityCollection, то в клиентском коде вполне реальна ситауция
PeopleGridAdapter.setCollection(CityCollection c);
Программа выполнится без ошибок, но чисто по логике - получилась какая-то хрень и результат будет не тот, что ожидается. Названия классов условны и понятно что можно было вместо PeopleGrid назвать класс TableGrid и написать разные реализации GridAdapter для разных коллекций, но проблема остается - в любую реализацию GridAdapter можно подставить любую реализацию Collection и получилась какая-то кривая логика

1. Как вообще правильно связывать интерфейсы и где в проекте такие связи должны хранится - Grid отдельный package, Collection отдельный package, а вот где должен быть GridAdapter ?
2. Подскажите какие-нибудь книги, в которых не только говорится что программировать надо на уровне интерфейсов, а есть примеры таких реализаций с больше чем 2 интерфейса
  • Вопрос задан
  • 141 просмотр
Пригласить эксперта
Ответы на вопрос 1
@Mercury13
Программист на «си с крестами» и не только
Тут лучше всего использовать шаблонные классы.
interface Collection <T> {}
class PeopleCollection implements Collection <Person> {}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы