Раннее и позднее связывание

Рассмотрим объектные типы Point и Circle. Они связаны отношением наследования и содержат, наряду с другими, методы SwitchOn, SwithOff и Move. Первые два из них реализуют алгоритмы рисования и удаления фигуры с экрана, они существенно различны для разных типов. Алгоритм же метода Move практически одинаков для обоих типов: удаление фигуры со старого места, изменение ее координат и рисование на новом месте. Например:

Procedure Move (dx, dy: integer);

Begin

SwitchOff;

X:=X+dx;

Y:=Y+dy;

SwitchOn;

end;

Рассмотрим вариант унаследования этого метода без переопределения. Пусть имеются экземпляры двух разных объектов:

Var

OnePoint: Point;

OneCircle: Circle;

то вызовы методов

OnePoint.Move (10, -20);

OneCircle.Move (10, -20);

приведут к одному и тому же действию: перемещению точки. Это связано с тем, что экземпляр типа-потомка вызывает унаследованный метод Move, который жестко связан с методами Point.SwitchOn и Point.SwitchOff на ранней стадии, то есть еще во время компиляции программы. В данном случае связь методов является статической.

Для того, чтобы в полной мере использовать свойство полиморфизма и использовать одни и те же унаследованные методы, по разному применяемые к разным объектам, необходимо, во-первых, разорвать связь метода Move с методами предка Point, во-вторых, обеспечить возможность вызывать разные методы SwitchOn и SwitchOff в зависимости от того, какой объект вызывает Move.

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: