Опубликован: 23.10.2005 | Доступ: свободный | Студентов: 4086 / 201 | Оценка: 4.44 / 4.19 | Длительность: 33:04:00
Специальности: Программист
Дополнительный материал 2:

Универсальность и (versus) наследование

< Дополнительный материал 1 || Дополнительный материал 2: 123456

Эмуляция наследования с помощью универсальности

Являются ли наследование и универсальность взаимозаменяемыми? Давайте рассмотрим возможность эмуляции каждой из этих техник средствами другой техники.

Рассмотрим сначала язык, подобный 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

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

Следовательно, ответ на вопрос, поставленный в данном разделе, отрицательный:

Эмуляция наследования

Эмуляция наследования с помощью универсальности не представляется возможной.

< Дополнительный материал 1 || Дополнительный материал 2: 123456