Связь между классами и интерфейсами

У меня вопрос о моделировании ассоциаций между классами и интерфейсами. Насколько мне известно, интерфейс определяет, что может делать объект; без указания состояния или функциональности (Когда использовать интерфейс вместо абстрактного класса и наоборот?). Кроме того, в моей книге по OOAD (объектно-ориентированное моделирование и дизайн Джеймса Рубо) говорится, что ассоциация описывает группу связей с общей структурой и общей семантикой между экземплярами объектов.

Теперь предположим, что у меня есть следующие объекты:

1) Интерфейс ICar: определяет операции, которые может выполнять автомобиль.

2) BMW: класс, реализующий интерфейс ICar.

3) IWheel: интерфейс, определяющий возможности колеса.

4) LuxuryWheel: класс, реализующий интерфейс IWheel.

Теперь, чтобы смоделировать отношения между BMW и LuuryWheel, что из перечисленного вы считаете правильным с точки зрения дизайна? Я поделился своими мыслями по каждому из них

A) Создайте связь между ICar и Iwheel. Класс BMW может создавать конкретные экземпляры класса LuxuryWheel. Это очень гибкий вариант, но он сочетает в себе возможности автомобиля с возможностями Wheel. Кроме того, в определении ассоциации говорится, что существует связь между экземплярами.

Б) Создайте ассоциацию между классом BMW и классом LuxuryWheel. Решает конкретную проблему; но крепко соединяет BMW с роскошными колесами

C) Создайте связь между классом BMW и интерфейсом Iwheel. Таким образом, BMW может использовать любой тип, реализующий интерфейс IWheel.

Вариант C) мне кажется лучше. Пожалуйста, поделитесь своими мыслями.


person Pradeep    schedule 18.01.2015    source источник


Ответы (3)


Я согласен с Владимиром в том, что, поскольку вы хотите моделировать автомобили и колеса с помощью интерфейсов, связь между ними (которая на самом деле является композицией) должна быть смоделирована между интерфейсами ICar и IWheel, как на следующей диаграмме:

введите описание изображения здесь

Поскольку классы BMW и LuxuryWheel реализуют интерфейсы ICar и IWheel, им также необходимо реализовать / реализовать эту ассоциацию / композицию, например с помощью 4-значного ссылочного свойства _7 _ :: _ 8_ или с помощью 4 различных ссылочных свойств в BMW: leftRearWheel, rightRearWheel, leftFrontWheel, rightFrontWheel.

person Gerd Wagner    schedule 18.01.2015
comment
+1 Вы можете добавить указанную связь между BMW и LuxuryWheel и добавить связь ‹‹refine›› между абстрактной ассоциацией и вашей ассоциацией. Это показывает, что ваше отношение на самом деле такое же, как указано между интерфейсами, но оно было уточнено для конкретных реализаций BMW и LuxuryWheel. - person Geert Bellekens; 19.01.2015

Чтобы получить надежное решение, создайте связь между интерфейсами ICar и IWheel. Это возможно, потому что интерфейсы - это типы. Подключение интерфейсов с использованием ассоциации означает, что любой экземпляр классификатора, который реализует интерфейс ICar, должен быть связан с экземпляром классификатора, который реализует IWheel. Вы также определяете абстрактные классы для автомобиля и колеса и устанавливаете связь между ними. Результат будет аналогичным.

person Vladimir    schedule 18.01.2015

Проще говоря, автомобиль может поддерживать разные типы двигателей. Поэтому вы должны подумать о дополнительном классе, который позволит добавлять другие типы двигателей. В этом случае связь между интерфейсами или классами должна осуществляться с помощью некоторого дополнительного интерфейса.

person Mihai8    schedule 18.01.2015