Мне часто приходится слышать суждения разработчиков о механизме подтипов как об отношении является (это [есть]). Я настоятельно рекомендую держаться подальше от такого представления. Проблема заключается в том, что выражение является может иметь самый разный смысл.
Рассмотрим следующие предложения.
1. Шеп - это бордер-колли.
2. Бордер-колли - это собака.
3. Собаки являются животными.
4. Бордер-колли-это порода собак.
5. Собака - это биологический вид.
Теперь попытаемся скомбинировать эти фразы. При объединении первого и второго предложений получаем «Шеп - это собака»; второе и третье предложения в результате дают «бордер-колли - это живот-
ные». Объединение первых трех фраз дает «Шеп - это животное». Чем дальше, тем лучше. Теперь попробуем первое и четвертое предложения; «Щеп - это порода собак». В результате объединения второго и пятого предложений получим «бордер-колли - это биологический вид». Это уже не так хорошо.
Почему некоторые из этих фраз можно комбинировать, а другие нельзя? Причина в том, что некоторые предложения представляют собой классификацию - объект Шеп (Shep) является экземпляром типа Бордер-Колли (Border Collie), в то время как другие предложения представляют собой обобщение - тип Бордер-Колли является подтипом типа Собака (Dog). Обобщение транзитивно, а классификация - нет. Если обобщение следует за классификацией, то их можно объединить, а если наоборот - классификация следует за обобщением, то нельзя.
|
|
Смысл сказанного в том, что с отношением является следует обращаться весьма осторожно. Его использование может привести к неверному применению подклассов и к ошибочному распределению ответственностей. В приведенном примере хорошими тестами для проверки подтипов могут служить следующие фразы: «Собаки являются разновидностью Животных» и «Каждый экземпляр Бордер-Колли является экземпляром Собаки».
В языке UML обобщение обозначается соответствующим символом. Для того чтобы показать классификацию, применяется зависимость с ключевым словом «instantiate».