ShiftX, ShiftY : integer; {Смещение второго конца}
public:
constructorCreate(Xl, Yl, X2, Y2 : integer);
{(X1;Y1) и (X2;Y2) - координаты концов отрезка}
procedureDraw(color : word); virtual;
{Рисует отрезок цветом color}
end;
Задание.Самостоятельно запишите реализацию методов этого объекта и унаследуйте от него объект TRect.
3. Полиморфизм— это возможность использовать одинаковые имена для методов разных объектов. Например, методы создания и рисования всех построенных объектов имеют одинаковые имена - Create и Draw, но каждый графический объект реализует их по-разному.
Рассмотрим действие унаследованногометода On объекта TCircle:
procedureTPoint.On;
Begin
Draw(GetColor)
end;
Переопределять этот метод не было необходимости, так как его реализация справедлива для окружности только при условии, что унаследованный метод Draw является переопределенным (рисует окружность). Процедуры этих методов были размещены в описании родительского типа TPoint. Компилятор всегда будет вызывать программный код Draw родительского типа TPoint согласно принятому статическому (раннему) механизму вызова функций, а именно
procedureTPoint.Draw(color : word);
Begin
PutPixel(X, Y, color) {Будет нарисована точка}
end;
Чтобы избежать этой ситуации, в описаниях метода Draw во всех построенных объектах используют служебное слово virtual:
procedureDraw(color : word); virtual;
Теперь адрес вызова нужного метода Draw определяется лишь на этапе выполнения программы. Вызов родительского метода On объектом типа TCircle приводит к вызову уже переопределенного метода Draw:
procedureTCircle.Draw(color : word);
Begin
SetColor(color);
Circle(X, Y, R) (Будет нарисована окружность}
end;
Этот механизм называют динамическим,или поздним связыванием,а метод Draw — виртуальным методом.Метод, описанный в родительском типе как виртуальный, должен быть описан как виртуальный во всех его потомках. Важно указать, что если объектный тип содержит хотя бы один виртуальный метод, то в состав объекта должен входить конструктор и его вызов должен предшествовать вызову этого метода.
Преимущества объектно-ориентированного программирования (ООП) наиболее ощутимы при создании сложных и больших по объему программ. Структуризация подпрограмм по признаку принадлежности (применимости) к конкретному объекту (свойство инкапсуляции) упрощает процесс программирования и навигацию по тексту программы на этапе разработки. Наследование и полиморфизм освобождают программиста от необходимости придумывать названия и писать тексты однотипных процедур, применимых к концептуально подобным объектам. Из приведенного выше примера видно, что без использования ООП пришлось бы составлять и записывать процедуры движения (Move), засвечивания (On) и гашения (Off) для каждого из типов объектов TCircle, TLine и TRect - лишних девять процедур.