Приведем реализацию типичной процедуры
rotate (center: POINT; angle: REAL) is
-- Поворот вокруг точки center на угол angle.
do
from
vertices.start
until
vertices.after
loop
vertices.item.rotate (center, angle)
vertices.forth
end
end
Чтобы понять эту процедуру заметим, что компонент
Более важна для наших целей процедура вычисления периметра многоугольника. Единственный способ вычислить периметр многоугольника - это в цикле пройти по всем его вершинам и просуммировать длины всех ребер. Вот возможная реализация процедуры
perimeter: REAL is
-- Сумма длин ребер
local
this, previous: POINT
do
from
vertices.start; this := vertices.item
check not vertices.after end -- Следствие условия at_least_three
until
vertices.is_last
loop
previous := this
vertices.forth
this := vertices.item
Result := Result + this.distance (previous)
end
Result := Result + this.distance (vertices.first)
end
В этом цикле просто последовательно складываются расстояния между соседними вершинами. Функция
Прямоугольники
Предположим теперь, что нам требуется новый класс, представляющий прямоугольники. Можно было бы начать его проектировать заново. Но прямоугольники это специальный вид многоугольников и у них много общих компонент: их также можно сдвигать, поворачивать и выводить на экран. С другой стороны, у них есть ряд специфических компонентов (например, диагонали), специальные свойства (число вершин равно четырем, а углы являются прямыми) и возможны специальные варианты некоторых операций (вычисление периметра можно устроить проще, чем в приведенном выше алгоритме).
Преимущества такой смеси общих и специфических компонентов можно использовать, определив класс
class RECTANGLE inherit
POLYGON
feature
... Компоненты, специфичные для прямоугольников ...
end
В предложении feature класса-наследника компоненты родителя не повторяются: они автоматически доступны благодаря предложению о наследовании. В нем будут указаны лишь компоненты, специфичные для наследника. Это могут быть новые компоненты, такие как
Вторая возможность полезна для такого компонента, который уже имелся у родителя, но у наследника должен быть описан в другом виде. Рассмотрим периметр
