Эмуляция наследования с помощью универсальности
Являются ли наследование и универсальность взаимозаменяемыми? Давайте рассмотрим возможность эмуляции каждой из этих техник средствами другой техники.
Рассмотрим сначала язык, подобный Ada (Ada 83), с поддержкой универсальности, но не наследования. Что можно сделать в этом случае для достижения эффекта наследования?
Простой путь - перегрузка имен. Как известно, Ada допускает многократное использование одних и тех же имен подпрограмм для операндов различных типов. Значит можно определить типы TAPE, DISK и другие, каждый с его собственной версией подпрограмм:
procedure open (p: in out TAPE; descriptor: in INTEGER); procedure close (p: in out DISK);Никакая двусмысленность не возникнет, если подпрограммы отличаются, по крайней мере, типом одного операнда. Но это решение не поддерживает полиморфизм и динамическое связывание. Как добиться различного результата вызова d.close после присваиваний d := di и d := ta, где di - DISK, а ta - TAPE?
Для получения такого эффекта придется использовать записи с вариантными полями:
type DEVICE (unit: DEVICE_TYPE) is record ... Поля одинаковые для устройств всех типов ... case unit is when tape => ... поля для ленточных накопителей ...; when disk => ... поля для дисковых накопителей ...; ... Другие варианты ...; end case end recordгде DEVICE_TYPE - перечислимый тип с элементами tape, disk и т. д. Тогда для каждого усройства можно определить индивидуальную версию каждой процедуры (open, close и т. д.)
case d'unit is when tape => ... действия для ленточных накопителей ...; when disk => ... действия для дисковых накопителей ...; ... другие варианты ...; end caseЗдесь каждый случай явно выделен и список выбора закрыт, поэтому для добавления новых вариантов выбора придется внести изменения во все аналогичные подпрограммы. Такая программная архитектура явно противоречит принципу Единственного выбора.
Следовательно, ответ на вопрос, поставленный в данном разделе, отрицательный:
Эмуляция наследования Эмуляция наследования с помощью универсальности не представляется возможной. |