Ада-95. Компилятор GNAT

       

Опасность наследования


Когда главный тип абстракции - производный, он наследует все примитивные методы своих предков.

Иногда некоторые из унаследованных методов не будут работать или будут не правильно работать с производной абстракцией (как правило из-за того, что они не имеют представления о новых атрибутах).

В подобных случаях возникает необходимость переопределения унаследованных методов.

Упущение необходимости переопределения метода является одной из широко распространенных ошибок.

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

Контролируемые объекты Ada 95 - это первые кандидаты для повышенного внимания в подобных ситуациях.

Любой контролируемый атрибут, добавленный в производной абстракции, требует переопределения унаследованных подпрограмм Adjust и Finalize

(как минимум).

Они должны вызываться, соответственно, для подгонки и очистки новых атрибутов.

Рассмотрим следующий пример:

package Coordinates is

type Object is tagged private; . . .

function Distance_Between (Left : in Coordinates.Object; Right: in Coordinates.Object) return Distance.Object; . . . end Coordinates;

package Position is

type Object is new Coordinates.Object with private; . . .

function Distance_Between -- переопределяет (Left : in Position.Object; -- Coordinates.Distance_Between Right : in Position.Object) return Distance.Object; . . . end Position;

Здесь, абстракция Position

является производной от абстракции Coordinates, но метод Distance_Between должен быть переопределен для учета в векторе позиции компонента высоты.



Содержание раздела