OpenU.Ru
Механизм, с помощью которого более специализированные элементы заимствуют структуру
и поведение более общих элементов.
См. full descriptor, generalization.
Семантика
Наследование позволяет автоматически конструировать полное описание обобщаемого
элемента при прохождении по иерархии обобщения фрагментов его объявления. Иерархия
обобщения представляет собой дерево объявлений элементов модели (частично упорядоченное)
- например, объявлений классов. Каждое из этих объявлений
не является объявлением законченного элемента модели, готового к использованию.
Напротив, каждое инкрементное объявление элемента описывает то, что добавляется
к объявлению предков этого элемента. Наследование - это неявный процесс комбинирования
таких инкрементных объявлений и создания из них полных дескрипторов, которые
описывают фактические экземпляры.
Считайте, что у каждого обобщаемого элемента есть два описания - сегментное
объявление и полный дескриптор. Сегментное объявление является инкрементным
списком черт, которые элемент объявляет в модели. Класс, например, объявляет
атрибуты и операции.
Сегментное объявление представляет собой приращение между элементом и его прямыми
предками. Полный дескриптор в модели явно
не участвует, так как представляет собой полное описание экземпляра
элемента, - например, полный перечень атрибутов и операций, которые есть у объекта
данного класса. Полный дескриптор - это объединение содержимого всех сегментных
объявлений элемента и всех его предков.
Таков механизм наследования - инкрементное определение элемента. Все прочие
подробности, например алгоритмы поиска метода, виртуальные таблицы и т. д.,
являются механизмами реализации, которые обеспечивают работу механизма наследования
в конкретном языке. На первый взгляд такое определение наследования может показаться
странным, однако в нем просто отсутствуют элементы реализации, которые есть
в большинстве других определений. Впрочем, несмотря на это, наше определение
вполне с ними совместимо.
Конфликтные ситуации
Конфликтная ситуация возникает в том случае, если во множестве наследуемых сегментов повторяется одна и та же черта. Ни один атрибут в таком множестве не может быть декларирован более одного раза. Если же это все-таки произошло, то между объявлениями возникает конфликт, а модель считается плохо согласованной. (С логической точки зрения это ограничение несущественно. Оно помогает избежать путаницы, которая может возникнуть в том случае, если атрибуты различаются только маршрутами к элементу.) Операцию же можно объявлять и несколько раз, при условии, что все объявления будут в точности повторять друг друга (при этом методы могут отличаться), или же при условии, что объявление прямого потомка будет усиливать наследуемое объявление (например, если прямой потомок будет объявлен запросом). Метод, объявленный у потомка, заменяет собой метод, объявленный у предка. Конфликта в данном случае нет. Если два разных метода наследуются от различных предков, один из которых не является предком другого, то между этими методами возникнет конфликтная ситуация, а модель будет считаться плохо согласованной.
Обсуждение
Обобщение представляет собой таксономическое
отношение между элементами. Оно описывает то, чем элемент является. Наследование
же - это механизм для комбинирования общих инкрементных описаний элемента с
целью получения полного его описания. Таким образом, эти отношения сильно отличаются
друг от друга, хотя у них есть и много общего. Если применить механизм наследования
к отношению обобщения, то описания можно будет разлагать на составляющие и делить
между элементами. Кроме того, это сделает возможным полиморфное поведение. Такой
подход принят в большинстве объектно-ориентированных языков, в том числе в UML.
Однако не стоит забывать, что существуют и другие подходы, которые используются
в некоторых языках программирования и которые тоже можно применять.