2015-01-18 2 views
1

У меня возник вопрос о моделировании ассоциаций между классами и интерфейсами. Насколько я знаю, интерфейс указывает, что может сделать объект; без обеспечения состояния или функциональности (When to use an interface instead of an abstract class and vice versa?). Кроме того, моя книга об OOAD (объектно-ориентированное моделирование и дизайн Джеймса Рубога) гласит, что ассоциация описывает группу связей с общей структурой и общей семантикой между экземплярами объектов.Ассоциация между классами и интерфейсами

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

1) ИКАР Интерфейс: Определяет операции автомобиль может сделать

2) BMW: Класс, который реализует интерфейс ИКАР

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

4) LuxuryWheel: класс, который реализует интерфейс IWheel

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

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

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

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

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

ответ

5

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

enter image description here

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

+1

+1 Вы можете добавить определенную ассоциацию между BMW и LuxuryWheel и добавить связь между абстрактной ассоциацией и вашей ассоциацией. <> Это показывает, что ваше отношение на самом деле такое же отношение, как указано между интерфейсами, но оно было доработано до конкретных реализаций BMW и LuxuryWheel –

0

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

1

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

Смежные вопросы