При наследовании выполняется очень интересный (и довольно сложный для понимания) принцип полиморфизма. Дело в том, что в родительском объекте и объекте-потомке могут быть методы с одинаковыми именами, но разной реализацией. Паскаль автоматически определяет, какой метод вызывать.
Например:
type TCar = Class
procedure Move;
end;
Ttruck = CLASS(TCar)
procedure Move;
end;
Здесь и у объекта-родителя Tcar, и у объекта-потомка Ttruck есть метод с названием Move. Внутренний код этих методов разный. Как же Паскалю определить, какой метод вызывать?
Очень просто – по типу переменной-объекта:
var Car: TCar;
truck: Ttruck;
begin
truck:=TTuck.Create;
Car:=TCar.Create;
{ вызовется метод Move класса Ttruck }
truck.Move;
{ вызовется метод Move класса Tcar }
Car.Move; . .
В данном примере есть два объекта: Car типа Tcar и truck типа Ttruck. При вызове метода Move объекта Car будет выполняться код, относящийся к объектному типу Tcar, а при вызове метода Move объекта Truck - относящийся к объектному типу Ttruck.
Зачем нужен полиморфизм? Прежде всего - для удобства программиста. Во всех сходных по смыслу объектах методы, выполняющие одни и те же операции (хотя и разными способами) называются одинаково.
А как быть, если нужно вызвать из объекта-потомка на выполнение родительский метод, а в объекте-потомке уже есть метод с таким именем? Такая задача возникает довольно часто. Рассмотрим метод "Начало движения" для легковой машины и самосвала. Очевидно, самосвалу сначала нужно опустить кузов, если он поднят, и поднять упоры. Далее же пуск легкового автомобиля и самосвала будут происходить одинаково. Было бы логично вынести эту одинаковую часть "вверх", в метод "Начало движения" объекта-родителя, а для самосвала в методе "Начало движения" сначала выполнить ряд дополнительных действий, а затем вызвать метод родителя – там уже написано все остальное.
Если у объекта есть родитель, можно вызывать его методы, совпадающие по названию с методами самого объекта, при помощи оператора INHERITED:
PROCEDURE Ttruck.Move;
BEGIN
{ специфические для самосвала действия }
{вызывается метод родителя}
INHERITED Move;
…
END;