Вот пример написания класса. Этот класс вычисляет сумму квадратов введенных чисел. Этот класс написан мной только для примера, и я исходил из соображений наглядности, а не оптимальности. Большая часть реализации не только не оптимальна, но и бессмысленна, но показывает большую часть простейших приемов создания класса.
Code: |
unit Unit2; {©Drkb v.3(2007): www.drkb.ru, ®Vit (Vitaly Nevzorov) - Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.}
interface
Uses classes, Sysutils;
{Нам нужен процедурный тип для создания собственного события. Собственно - это описание процедуры которая должна будет исполнятся при каких-нибудь обстоятельствах}
Type TError = procedure(Sender:TObject; Error: string) ofobject;
{Описание нашего класса, мы его наследуем от TObject, потому ?то нам практи?ески не нужна никакия функциональность предков} Type TStatistic=Class(TObject) private{здесь описываются только внутренние переменные и процедуры - "для служебного пользования"} {Описание полей, т.е. переменных которые работают только внутри класса, "снаружи" они не доступны.} FList:TStringList; FPrecision: byte; {Тоже переменная - для определения события} FonError: TError; {функция - будет использоваться только внутри класса, "снаружи" напрямую не доступна} function GetCount: integer; public{Описанное здесь доступно для пользователя класса} {Конструктор - метод создания класса, имеет смысл его описывать только если он делает ?то-то специфи?еское - например нам надо будет создать переменную FList. В противном слу?ае его описание можно опустить - будет работать конструктор родительского класса} Constructor Create; {Деструктор - метод разрушения класса} Destructor Destroy; override; {Описание методов - собственно методы мало ?ем отли?аются от процедур} Procedure AddValue(Value:String); Procedure Clear; Function Solve:real; {Описание свойств. Обратите внимание само свойство не способно хранить никакую информацию, это только указатель на внутренюю струкруру. Например для хранения свойства Precision используется переменная FPrecision. А для ?тение свойства Count используется функция GetCount} Property Precision:byte read FPrecision write FPrecision; Property Count:integer read GetCount; {Описание событий. ?то такое событие? - Это указатель на процедуру. Сам класс реализации этой процедуры не знает. Классу известно только заголовок процедуры, вы в коде программы будете писать реализацию процедуры, а класс только в нужный момент передаст ей управление, используя указатель onError} Property onError:TError read FonError write FonError; end;
implementation
{ TStatistic }
constructor TStatistic.Create; begin inherited; {Вна?але надо вызвать конструктор класса-родителя} FList:=TStringList.create;{создаем структуры нашего класса} end;
destructor TStatistic.Destroy; begin FList.Free;{Разрушаем структуры нашего класса} inherited;{в последнюю о?ередь вызываем деструктор клсса-родителя} end;
procedure TStatistic.AddValue(Value: String); begin FList.add(Value); {Примерно так мы реализуем метод} end;
procedure TStatistic.Clear; begin FList.clear; end;
function TStatistic.GetCount: integer; begin Result:=FList.count+1; end;
function TStatistic.Solve: real; var i:integer; begin result:=0; for i:=0to FList.count-1do begin try result:=result+(Sqr(strtofloat(FList[i]))); except {интересная конструкция. "on e:exception do" - мы "отлавливаем" ошибку как переменную "e". Эта переменная имеет о?ень полезное свойство e.message - оно содержит описание ошибки. Далее следует вызов события. Вна?але мы проверяем использует ли пользователь событие: "if Assigned(FOnError) then", если использует то вызываем его процедуру: FOnError, с параметрами: self - зарезервированная переменная - указатель на экземпляр нашего класса, e.message - описание ошибки} on e:exception do if Assigned(FOnError) then FOnError(Self, e.message); end; end; end;
end.
Вот пример использования этого класса:
unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private procedure OnError(Sender:TObject; Error: string); public { Public declarations } end;
var Form1: TForm1;
implementation
uses Unit2;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject); var Statistic:TStatistic; begin Statistic:=TStatistic.create; Statistic.onError:=onError; Statistic.AddValue('123423'); Statistic.AddValue('123423'); showmessage(floattostr(Statistic.solve)); Statistic.Clear; Statistic.AddValue('123423'); Statistic.AddValue('12ssss3'); showmessage(floattostr(Statistic.solve)); Statistic.Free; end;
procedure TForm1.OnError(Sender: TObject; Error: string); begin showmessage('Error inside class:'+Sender.ClassName+#13#10+Error); end;
end. |
Автор:Vit
Взято с Vingradhttps://forum.vingrad
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!