• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Наследование и полиморфизм в Delphi. Необходима помощь.

  • Автор темы Автор темы So What
  • Дата начала Дата начала

So What

Ученик
Регистрация
1 Апр 2011
Сообщения
2
Реакции
0
Баллы
0
Наследование и полиморфизм в Delphi. Необходима помощь.

Помогите, пожалуйста выполнить вот эту задачу:

Реализовать следующие иерархии объектов и заданные методы для них. На примере этих объектов продемонстрировать позднее связывание и полиморфизм:
Точка, окружность, эллипс:
Методы – рисование, стирание, движение, растяжение, сжатие, вращение.

То есть нужно создать программу, которая будет работать с такими объектами, как точка, окружность и эллипс, связанных в иерархию наследованием(выбирается объект, отображается, и его передвигают, растягивают и т п). При этом работа с объектом осуществляется единообразно – с использованием указателя на базовый класс.
 
Вот например программа для точки окружности и многоугольника.

unit Unit3; // Пользовательская иерархия графических объектов
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus,ExtCtrls;
type
// Наша декларация точки
// Основное - использование массива TForm.Canvas.Pixels[x,y]
//
TMyPoint = class {Объект}
public
X,Y: Integer;
Visible: Boolean; {свойство - Видимость !!!}
Color: TColor;
public
function GetX: Integer; {Получить координату Х}
function GetY: Integer; {Получить координату Х}
constructor Create(InitX, InitY: Integer;IColor:TColor);
destructor Free;virtual;
procedure Show;virtual; {Показать объект на экране}
procedure Hide;virtual; {Убрать объект с экрана }
function IsVisible: Boolean; {Проверить видимость объекта }
procedure MoveTo(NewX, NewY: Integer); { Переместить объект}
end;{class}

// Наша декларация круга
// Основное - использование виртуальных правил в модуле 1
//
TCircle = class (TMyPoint) {Объект круг - наследник точки}
R: Integer; { Его новое качество - радиус }
public
constructor Create(InitX, InitY: Integer; InitRadius: Integer;IColor:TColor);
destructor Free;override;
procedure Show; override;
procedure Hide; override; { Новое правило перекроет правило точки !!! }
procedure Expand(ExpandBy: Integer); {Правило Расшириться }
procedure Contract(ContractBy: Integer); {Правило Сжаться }
end; ;{class}

// Наша декларация правильного многоугольника
// Основное – использование массива TStrings для хранения точек и
// корректной перерисовки фигуры при смещении окна

TPoligon = class (TCircle) {Объект правильный многоугольник - наследник точки}
Points: array of TPoint;
NumOfVertex: integer; //число вершин
Phi: double; // начальный угол для одной из вершин (1)
public
constructor Create(InitX, InitY, IR,INum: Integer;IColor:TColor);
destructor Free;override;
procedure Recalculate;
procedure Show;override; { Новое правило перекроет правило точки !!! }
procedure Hide;override; { Новое правило перекроет правило точки !!! }
procedure Rotate(phi1: double); { Вращать}
end;{class}

implementation
uses unit1;

// Реализация класса Point
constructor TMyPoint.Create(InitX, InitY: Integer;
IColor:TColor);
begin
X:=InitX; Y:=InitY; Visible := False;{ Первоначально точка невидима }
Color:=Icolor;
end; {proc}

destructor TMyPoint.Free;
begin
end; {proc}

function TMyPoint.GetX: Integer;
begin GetX := X; end; {proc}

function TMyPoint.GetY: Integer;
begin GetY := Y; end; {proc}


procedure TMyPoint.Show;
begin
Visible := True; { Делаем атрибут точки - видимая }
with Form1.Canvas do begin
{ Прорисовываем ее цветом }
// Когда "толстая" точка приведет к ошибке?
Pixels[X,Y]:=Color; Pixels[X+1,Y]:=Color;
Pixels[X-1,Y]:=Color; Pixels[X,Y+1]:=Color; Pixels[X,Y-1]:=Color;
end;
end; {proc}

procedure TMyPoint.Hide;
begin
Visible := False; { Атрибут точки - невидимая }
with Form1.Canvas do begin
{ Прорисовываем ее цветом фона окна }
Pixels[X,Y]:=clBtnFace; Pixels[X+1,Y]:=clBtnFace;
Pixels[X-1,Y]:=clBtnFace; Pixels[X,Y+1]:=clBtnFace; Pixels[X,Y-1]:=clBtnFace;
end;
end; {proc}

function TMyPoint.IsVisible: Boolean;
begin
IsVisible := Visible;
end; {proc}

procedure TMyPoint.MoveTo(NewX, NewY: Integer);
begin
Hide; { Спрятать объект. Заметьте, что это верно и для потомков!}
X := NewX; Y := NewY;
Show; { Показать объект. Заметьте, что это верно и для потомков!}
end; {proc}

//Реализация методов объекта Circle:
constructor TCircle.Create(InitX, InitY: Integer; InitRadius: Integer;IColor:TColor);
begin
inherited Create(InitX, InitY,IColor); { Вызвать конструктор родителя }
R := InitRadius; { Установить начальный радиус }
end; {proc}

destructor TCircle.Free;
begin
inherited Free;
end; {proc}

procedure TCircle.Show;
var
tmpcolor:TColor;
begin
tmpColor:=Form1.Canvas.Pen.Color; Form1.Canvas.Pen.Color:=Color;
Form1.Canvas.Ellipse(X-(R div 2),Y-(R div 2),X+(R div 2),Y+(R div 2));
Form1.Canvas.Pen.Color:=tmpColor;
Visible := True; { Атрибут объекта - видимый }
end; {proc}

procedure TCircle.Hide;
var
TmpColor: TColor;
begin
tmpColor:=Form1.Canvas.Pen.Color; Form1.Canvas.Pen.Color:=clBtnFace;
Form1.Canvas.Ellipse(X-(R div 2),Y-(R div 2),X+(R div 2),Y+(R div 2));
Form1.Canvas.Pen.Color:=tmpColor;
Visible := False; { Атрибут объекта - невидимый }
end; {proc}

procedure TCircle.Expand(ExpandBy: Integer);
begin
Hide; { Спрятать объект }
R := R + ExpandBy; { Увеличить радиус }
if R < 0 then R := 0;
Show; { Прорисовать с новым радиусом}
end; {proc}

procedure TCircle.Contract(ContractBy: Integer);
begin
Expand(-ContractBy); { Использовать расширение со знаком минус }
end; {proc}

//Реализация методов объекта Poligon
constructor TPoligon.Create(InitX, InitY, IR,INum: Integer;IColor:TColor);
var
i:integer;
begin
{ Вызвать конструктор родителя, черный круг}
inherited Create(InitX, InitY,IR, clBlack);
NumofVertex:=INum; // число вершин
Phi:=0; // начальный угол
SetLength(Points, NumofVertex); //установить размер массива
Recalculate;
end; {proc}

destructor TPoligon.Free;
begin
inherited Free;
Points:=nil;
end; {proc}

procedure TPoligon.Recalculate; // Пересчет координат вершин
var
i:integer;
begin
for i:=0 to NumofVertex do begin
Points.X:=trunc(X+R*Cos(phi+i*2*Pi/NumofVertex));
Points.Y:=trunc(Y+R*Sin(phi+i*2*Pi/NumofVertex));
end;
end; {proc}

procedure TPoligon.Show;
var
tmpcolor:TColor; i:integer;
begin
Recalculate;
tmpColor:=Form1.Canvas.Pen.Color; Form1.Canvas.Pen.Color:=Color;
Form1.Canvas.MoveTo(Points[0].x,Points[0].Y);
for i:=Low(Points)+1 to High(Points) do begin
Form1.Canvas.LineTo(Points.x,Points.Y);
end;
Form1.Canvas.LineTo(Points[0].x,Points[0].Y);
Form1.Canvas.Pen.Color:=tmpColor;
Visible := True; { Атрибут объекта - видимый }
end; {proc}
procedure TPoligon.Hide;
var
TmpColor: TColor;
i:integer;
begin
Recalculate;
tmpColor:=Form1.Canvas.Pen.Color; Form1.Canvas.Pen.Color:=clBtnFace;
Form1.Canvas.MoveTo(Points[0].x,Points[0].Y);
for i:=Low(Points)+1 to High(Points) do begin
Form1.Canvas.LineTo(Points.x,Points.Y);
end;
Form1.Canvas.LineTo(Points[0].x,Points[0].Y);
Form1.Canvas.Pen.Color:=tmpColor;
Visible := False; {Атрибут объекта - невидимый}
end; {proc}

procedure TPoligon.Rotate(phi1:double);
begin
Hide; {Спрятать объект}
phi:=phi+phi1;
Show; {Прорисовать с новым радиусом}
end; {proc}
end. {Unit3}
 
Назад
Сверху