Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Uml Book (Rus).doc
Скачиваний:
15
Добавлен:
11.08.2019
Размер:
58.74 Mб
Скачать

Абстрактные, корневые, листовые и полиморфные элементы

Отношения обобщения используются для моделирования иерархии классов, верхние уровни которой занимают общие абстракции, а ниже находятся специа­лизированные (см. главы 5 и 10). Внутри этой иерархии некоторые классы опре­деляют как абстрактные, то есть не имеющие непосредственных экземпляров (см. главу 13). В языке UML имя абстрактного класса пишут курсивом. Например, как видно из рис. 9.5, абстрактными являются классы Icon, Rectangularlcon и Arbitrarylcon. Наоборот, конкретными называются классы, которые могут иметь непосредственные экземпляры (на рис. 9.5 это Button и OkButton).

При моделировании класса часто возникает потребность задать ему свойства, унаследованные от более общих классов и, наоборот, предоставить возможность более специализированным классам наследовать особенности данного. Такая се­мантика легко обеспечивается для классов средствами UML. Можно определить и такие классы, у которых нет потомков. Они называются листовыми и задаются в UML с помощью свойства leaf, написанного под именем класса. Например, класс OkButton на рис. 9.5 является листовым и поэтому не имеет потомков.

Реже используется, хотя и остается весьма полезной, возможность задать класс, не имеющий родителей. Такой класс называется корневым и специфицируется с помощью свойства root, записанного под его именем. На рис. 9.5 корневым является класс Icon. Если имеется несколько независимых иерархий наследова­ния, то начало каждой удобно обозначать таким способом.

Операции могут иметь сходные свойства. Как правило, операции являются по­лиморфными, - это значит, что в различных местах иерархии классов можно опре­делять операции с одинаковыми сигнатурами. При этом те операции, которые определены в классе-потомке, перекрывают действие тех, что определены в роди­тельских классах. Когда во время исполнения системы поступает какое-то сооб­щение (см. главу 15), операция по его обработке вызывается полиморфно, иными словами, выбирается та, которая соответствует типу объекта. На рис. 9.5 Операции display и islnside являются полиморфными, a Icon: : display (), кроме того, еще и абстрактна. Это значит, что она неполна и реализацию должен предоставить потомок. В UML имена абстрактных операций пишутся курсивом,

как и в случае с классами. Напротив, операция Icon: : get ID () является листо­вой, на что указывает слово leaf. Это означает, что данная операция не полимор­фна и не может быть перекрыта другой.

Примечание Абстрактные операции соответствуют чисто виртуальным опе­рациям языка C++, листовые операции - невиртуальным операци­ям этого языка.

Кратность

При работе с классом разумно предположить, что может существовать любое количество его экземпляров (см. главу 13) - если, конечно, это не абстрактный класс, у которого вообще не существует непосредственных экземпляров, хотя у его потомков их может быть любое количество. В некоторых случаях, однако, число экземпляров класса нужно ограничить. Чаще всего возникает необходимость за­дать класс, у которого:

Q нет ни одного экземпляра - тогда класс становится служебным (Utility), со­держащим только атрибуты и операции с областью действия класса;

  • ровно один экземпляр - такой класс называют синглетным (Singleton); ,

  • заданное число экземпляров;

  • произвольное число экземпляров - вариант по умолчанию.

Количество экземпляров класса называется его кратностью. В общем смысле кратность - это диапазон возможных кардинальных чисел некоторой сущности (кратность встречается также у ассоциаций, см. главы 5 и 10). В языке UML крат­ность класса задается выражением, написанным в правом верхнем углу его пик­тограммы. Например, как показано на рис. 9.6, класс NetworkCont roller явля­ется синглетным, а у класса ControlRod имеется ровно три экземпляра.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]