Технический форум

Технический форум (http://www.tehnari.ru/)
-   Delphi, Kylix and Pascal (http://www.tehnari.ru/f43/)
-   -   Наследование и полиморфизм в Delphi. Необходима помощь. (http://www.tehnari.ru/f43/t49775/)

So What 01.04.2011 22:41

Наследование и полиморфизм в Delphi. Необходима помощь.
 
Помогите, пожалуйста выполнить вот эту задачу:

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

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

So What 01.04.2011 22:50

Вот например программа для точки окружности и многоугольника.

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[i].X:=trunc(X+R*Cos(phi+i*2*Pi/NumofVertex));
Points[i].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[i].x,Points[i].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[i].x,Points[i].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}


Часовой пояс GMT +4, время: 17:34.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.