На диаграмме UML, когда класс должен быть абстрактным? - PullRequest
5 голосов
/ 05 февраля 2011

В диаграмме UML, когда класс должен быть абстрактным? Просто когда мы хотим предотвратить создание экземпляров?

Редактировать: Может ли абстрактный класс полностью реализовать метод (когда метод зависит только от атрибутов этого абстрактного класса)?

Ответы [ 7 ]

6 голосов
/ 05 февраля 2011

Предотвращение создания экземпляров - это вопрос реализации, поэтому это хорошая причина, если вы думаете о Java, C # и т. Д.

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

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

Ответ на редактирование: Да!

6 голосов
/ 05 февраля 2011

Класс является абстрактным, если он имеет одну или несколько абстрактных операций.

В UML обозначить реферат курсивом или {abstract}.

Следующая диаграмма (которая находится на странице 70 моей книги UML Distilled Third Edition от Мартина Фаулера) показываеткак и зачем обозначать тезисы: enter image description here

4 голосов
/ 05 февраля 2011

Абстрактный класс a - это базовая концепция ООП, поэтому я не думаю, что ваш вопрос относится к UML.
Вот вопрос о том, когда использовать абстрактные классы:

Точное использование Abstractclass

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

Например, вы можете извлечь базовую функциональность FileLogger и EmailLogger в класс Logger, однако, так как он этого не делаетимеет смысл сам по себе, вы просто оставляете это абстрактным.

0 голосов
/ 05 февраля 2011

хорошо, абстрактный класс означает, что вы можете поддерживать список методов или переменных (public static final по умолчанию внутри абстрактного класса), это заставляет класс расширять этот абстрактный класс для реализации методов, не реализованных в объявленном абстрактном классе, (abstract класс имеет высокое сходство с интерфейсами, но единственное отличие состоит в том, что интерфейсы являются 100% абстрактными классами).

0 голосов
/ 05 февраля 2011

Абстрактный класс похож на обычный класс, за исключением того, что он позволяет вам определять заголовки метода без тела метода.

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

0 голосов
/ 05 февраля 2011

Когда вы пытаетесь выразить подклассы, например, когда вы хотите сделать явным, Cat - это один особый случай Animal.

Например, Animal может иметь некоторую базовую реализацию нанекоторые поведения, например Eat, которые могут быть переопределены на подклассах.

0 голосов
/ 05 февраля 2011

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

например. Животное. У каждого класса животных есть метод isAlive (). Этот метод одинаков для всех животных. И у каждого животного есть свой метод перемещения (цель). Но каждое животное движется по-своему. Вы не можете говорить о движении животного в целом. Некоторые животные летают, некоторые плавают, а некоторые бегают.

...