Java UML Student Worker проект множественного наследования - PullRequest
0 голосов
/ 25 мая 2018

У меня есть упражнение, которое требует от нас предоставить диаграмму UML для следующего:

  • Класс Person (аннотация)
  • Учащийся (имя, фамилия, школа, классы))
  • Работник (имя, фамилия, зарплата) продлевает Лицо

Студентом может быть рабочий.Рабочий также может быть студентом.Как бы мне этого добиться?

Это мое решение, но я понимаю, что оно неэффективно:

enter image description here

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

Возможное решение будет следующим: enter image description here

Это решение добавляет дополнительный класс для случая, когда студент одновременно является работником.

Первое обновление

На следующем рисунке показано, как StudentWorker может наследоваться от Worker и Student, хотя это может быть невозможно на всех языках программирования и может привести к Проблема с бриллиантами .

enter image description here

Второе обновление

Это решение используется толькореализации интерфейсов:

enter image description here

Обратите внимание, что вам все еще нужно 3 класса.Student и Worker реализуют по два интерфейса каждый, StudentWorker реализует все три интерфейса.Это делает все три класса Person, а также Student, IStudent, Worker, IWorker и StudentWorker, IStudent и IWorker.Я надеюсь, что это поможет или даст вам представление о том, как создать ваше индивидуальное решение.

0 голосов
/ 05 июня 2018

Это может или не может быть ответом на ваше упражнение.Если бы я получил эти требования в реальном мире, я бы их рефакторинг.(Конечно, в реальном мире у меня было бы много вопросов о дальнейших уточнениях и деталях.) Реальная ситуация такова (мы можем предположить), что мы имеем дело с людьми, у которых всегда есть имя и фамилия.Поскольку имена и фамилии не меняются (мы также можем предположить), когда человек специализируется на подклассах, нет никаких оснований предоставлять средства для их реализации по-разному в подклассах.Поэтому нет причин делать абстрактный класс person, поскольку именно поэтому вы создаете абстрактные классы.

Это также ситуация, когда агрегация (один класс "имеет" другие классы) имеет больше смысла, чем наследование (подкласс"это" суперкласс).Поэтому я бы перестроил требования следующим образом:

Лицо: Имя, Фамилия Учащийся: Школа, класс Работник: Зарплата

Класс человека может "иметь" от нуля до одного класса ученика.Класс Person может «иметь» от одного до одного класса Worker.

Существует также смысл, требуя от лица быть абстрактным, что человек должен быть либо учеником, либо работником, либо и тем, и другим.Это может быть задано ограничением or между двумя классами.

Вот диаграмма:

enter image description here

Класс Person имеетсовокупные отношения как с учениками, так и с рабочими классами.Один класс может иметь от одного до одного ученика.Один класс может также иметь от одного до одного рабочего класса.Ограничение {or} дополнительно указывает, что должен быть один из них: либо студент, либо работник, либо по одному из каждого.

0 голосов
/ 25 мая 2018

Студент и работник будут подклассом класса Person.Человек будет иметь общие атрибуты, которые являются общими (имя и фамилия).У ученика будут школьные оценки, а у работника будет зарплата.

Вот как вы можете представлять наследование в UML:

enter image description here

У вас естьсуперкласс, и ваши производные классы.Поскольку ваш суперкласс абстрактный, в нем будут методы, которые объявлены без реализации, вы будете реализовывать их в своих классах Student и Worker (если это необходимо).

Если у вас есть другой учащийся класса,это унаследует и от студента и от работника.Таким образом, это будет примерно так:

enter image description here

A - это ваш абстрактный класс Person, B и C - учащийся и работник соответственно, а D - StudentWorker.StudentWorker унаследует атрибуты ученика и работника.

...