Класс-Квадрат
|Класс-Угол
||Класс-Сторона
|end
end
Иерархия классов
Цитата:
Создать иерархию классов четырехугольник и квадрат.
Переопределить вывод в поток и ввод из потока, конструктор
копирования, оператор присваивания через соответствующие
функции базового класса.
Взываю к Вашей помощи. Зараннее благодарен.
Код:
И как пользоваться иерархией? Зачем это, собственно говоря, нужно?..
Ну вот у тебя есть класс TButton, вот его иерархия (те от каких классов он был наследником)
TObject
TPersistent
TComponent
TControl
TWinControl
TButtonControl
TButton
В вашем случае будет что то типа этого
будет прямоугольник и квадрат (квадрат - наследник квадрата)
TRect > TQuad
Код:
program Project1;
{$APPTYPE CONSOLE}
type
//класс свободный-прямоугольник - содержит в себе информацию о положении
//и размере черырехугольника
TCustomRect = class(Tobject)
private
//Положение прямоугольника
FTop: Integer;
FLeft: Integer;
//Размеры
FWidth: Integer;
FHeight: Integer;
//Процедуры установки положенмия
procedure SetLeft(const Value: Integer);
procedure SetTop(const Value: Integer);
//Процедуры изменения размера
procedure SetHeight(const Value: Integer); virtual;
procedure SetWidth(const Value: Integer); virtual;
public
Property Left : Integer read FLeft write SetLeft;
Property Top : Integer read FTop write SetTop;
Property Width : Integer read FWidth write SetWidth;
Property Height : Integer read FHeight write SetHeight;
function Assign(obj : TCustomRect) : Boolean; virtual;
end;
//Квадрат является частным случаем прямоугольника
//поэтому мы можем использовать класс TCustomRect
//Немного его модифицировав
TQuad = Class(TCustomRect)
private
//Перезаписываем методы установки ширины и высоты
//Так что бы при изменении ширины менялась высота
//и наоборот
procedure SetHeight(const Value: Integer); override;
procedure SetWidth(const Value: Integer); override;
public
//Процедура копирования объекта так же переписывается
//Значения можно присовить только если у TCustomRect
//Width = Height
function Assign(obj : TCustomRect) : Boolean; override;
end;
{ TCustomRect }
function TCustomRect.Assign(obj: TCustomRect): Boolean;
begin
Result := False;
if not Assigned(obj) then exit;
fLeft := obj.FLeft;
FTop := obj.FTop;
FWidth := obj.FWidth;
FHeight := obj.FHeight;
result := true;
end;
procedure TCustomRect.SetHeight(const Value: Integer);
begin
FHeight := Value;
end;
procedure TCustomRect.SetLeft(const Value: Integer);
begin
FLeft := Value;
end;
procedure TCustomRect.SetTop(const Value: Integer);
begin
FTop := Value;
end;
procedure TCustomRect.SetWidth(const Value: Integer);
begin
FWidth := Value;
end;
{ TQuad }
function TQuad.Assign(obj: TCustomRect): Boolean;
begin
Result := False;
if not Assigned(obj) then exit;
if (obj.FWidth <> obj.FHeight) then exit;
//тут мы вызываем метод родителя TCustomRect.Assign()
//а не TQuad.Assign()
result := TCustomRect(self).Assign(obj)
end;
procedure TQuad.SetHeight(const Value: Integer);
begin
FHeight := Value;
FWidth := Value;
end;
procedure TQuad.SetWidth(const Value: Integer);
begin
FHeight := Value;
FWidth := Value;
end;
begin
end.
{$APPTYPE CONSOLE}
type
//класс свободный-прямоугольник - содержит в себе информацию о положении
//и размере черырехугольника
TCustomRect = class(Tobject)
private
//Положение прямоугольника
FTop: Integer;
FLeft: Integer;
//Размеры
FWidth: Integer;
FHeight: Integer;
//Процедуры установки положенмия
procedure SetLeft(const Value: Integer);
procedure SetTop(const Value: Integer);
//Процедуры изменения размера
procedure SetHeight(const Value: Integer); virtual;
procedure SetWidth(const Value: Integer); virtual;
public
Property Left : Integer read FLeft write SetLeft;
Property Top : Integer read FTop write SetTop;
Property Width : Integer read FWidth write SetWidth;
Property Height : Integer read FHeight write SetHeight;
function Assign(obj : TCustomRect) : Boolean; virtual;
end;
//Квадрат является частным случаем прямоугольника
//поэтому мы можем использовать класс TCustomRect
//Немного его модифицировав
TQuad = Class(TCustomRect)
private
//Перезаписываем методы установки ширины и высоты
//Так что бы при изменении ширины менялась высота
//и наоборот
procedure SetHeight(const Value: Integer); override;
procedure SetWidth(const Value: Integer); override;
public
//Процедура копирования объекта так же переписывается
//Значения можно присовить только если у TCustomRect
//Width = Height
function Assign(obj : TCustomRect) : Boolean; override;
end;
{ TCustomRect }
function TCustomRect.Assign(obj: TCustomRect): Boolean;
begin
Result := False;
if not Assigned(obj) then exit;
fLeft := obj.FLeft;
FTop := obj.FTop;
FWidth := obj.FWidth;
FHeight := obj.FHeight;
result := true;
end;
procedure TCustomRect.SetHeight(const Value: Integer);
begin
FHeight := Value;
end;
procedure TCustomRect.SetLeft(const Value: Integer);
begin
FLeft := Value;
end;
procedure TCustomRect.SetTop(const Value: Integer);
begin
FTop := Value;
end;
procedure TCustomRect.SetWidth(const Value: Integer);
begin
FWidth := Value;
end;
{ TQuad }
function TQuad.Assign(obj: TCustomRect): Boolean;
begin
Result := False;
if not Assigned(obj) then exit;
if (obj.FWidth <> obj.FHeight) then exit;
//тут мы вызываем метод родителя TCustomRect.Assign()
//а не TQuad.Assign()
result := TCustomRect(self).Assign(obj)
end;
procedure TQuad.SetHeight(const Value: Integer);
begin
FHeight := Value;
FWidth := Value;
end;
procedure TQuad.SetWidth(const Value: Integer);
begin
FHeight := Value;
FWidth := Value;
end;
begin
end.
Вопросу чувствую будут.
Благодарю!
*сел_разбираться
Мне кажется что требуется создать класс четырехугольник, от него уже унаследовать класс квадрат. Ибо квадрат - частный случай четырехугольника.
четырехугольник->параллелепипед->Ромб->Квадрат
квадрат - частный случай ромба. а ромб это частный случай параллелепипеда
Ну это конечно все хорошо и правильно, но только я в исходном условии параллелепипеда и ромба не вижу..