Другие языки программирования и технологии

Всем привет! программа Делфи

Поставлена задача создать консольное приложение с классом TSquare.Вычислить площадь и периметр методами: Area и Perimetr.
Создал код, но препод забраковал его, хотя всё высчитывает и работает нормально. Являюсь новичком. Может, кто поможет, что здесь не так.
Голову уже сломал. Нормальных самоучителей не могу найти, чтобы было ясно и понятно.
Как поставить деструктор?

program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils;

type TSquare=class
private
x,y,a:integer;
public
constructor create(ax,ay,aa:integer);
function perimetr:integer; //ïåðèìåòð
function area:integer; //ГЇГ «Г®Г№Г*äü
procedure show;//ðåçóà «ГјГІГ*ГІ
function verify(tx,ty:integer):boolean;//ïðîâåðêГ*
end;
constructor TSquare.Create;
begin
inherited Create;
x:=ax; y:=ay; a:=aa;
end;
function TSquare.perimetr;
begin
result:=4*a;
end;
function TSquare.area;
begin
result:=a*a;
end;
procedure TSquare.show;
begin
writeln('Perimetr=',perimetr);
writeln('Ploshad=',area);
end;
function TSquare.verify(tx,ty:integer):boolean;
begin
result:=(x+a div 2=tx)and(y-a div 2=ty);
end;
var sqA:TSquare;
x1,y1,a1:integer;
begin
writeln('Vvedite xA,yA,aA');
readln(x1,y1,a1);
sqA:=TSquare.create(x1,y1,a1);
sqA.show;
readln

end.
Как по мне, у тебя просто избыточный класс.
В рамках данной задачи конструктор толжен принимать только один параметр - сторону квадрата.
Все методы, кроме Area и Perimeter - лишние. Не просят - не городи сущностей.
Называй поля значимыми именами. Если у тебя есть поле "размер стороны" - ну так и назови его "SideSize". Имеет смысел также сделать соотв. свойство для доступа к полю - все-таки размер в данном случае имеет значение, не находишь?
Насчет деструктора - он тут нахрен не уперся. Т. е. твой класс и так наследует от TObject, а у него деструктор уже есть. Препод имел ввиду, что ты нигде не ВЫЗЫВАЕШЬ деструктор. Тоже в данном сличае не критично, потому что винда подчистит, но некрасиво так делать.

В общем, сделай вот что:

TSquare=class
private
FSideSize: integer;
public
constructor Create(_iSideSize: integer);
function Perimeter: integer;
function Area: integer;
property SideSize: integer read FSideSize;
end;

Дальше реализуешь это дело, а затем

with TSquare.Create(iSideSize) do
try
...
finally
Free; //Вызов деструктора.
end;

Удачи.
Виктор Труш
Виктор Труш
71 832
Лучший ответ
Александр Сизоненко спасибо большое! буду пробовать
Класс не должен ничего выводить и запрашивать ввод данных. Это должна делать вызывающая программа.

Насчёт деструктора:

type TSquare=class
private
x,y,a:integer;
public
constructor create(ax,ay,aa:integer);
function perimetr:integer; //ïåðèìåòð
function area:integer; //ГЇГ «Г®Г№Г*äü
procedure show;//ðåçóà «ГјГІГ*ГІ
function verify(tx,ty:integer):boolean;//ïðîâåðêГ*
destructor Destroy(); override; //<<---
end;
...
implementation
...
destructor TSquare.Destroy();
begin
//тут код
inherited;
end;
Александр Сизоненко благодарю! сейчас обдумаю. очень хочу разобраться!
А что учитель-то сказал?
Александр Сизоненко я в первый раз делаю. если не сложно, что нужно поправить в моем коде? сказал еще, что без деструктора никуда...
Александр Сизоненко было сказано, что проверка не нужна (ее уберу) и что без деструктора не прокатит. а в остальном сиди и думай типа. я так понимаю, корректировка нужна.