Главная Случайная страница



Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать неотразимый комплимент Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника







Interface





Uses

Windows, Messages, SysUtils, Variants, Classes, Graphics,

Controls, Forms, Dialogs;

Type

TForm1 = class(TForm) { TForm1 класын жариялау}

Button1: TButton; {өріс}

Button2: TButton; {өріс}

L1: TLabel; {өріс}

L2: TLabel; {өріс}

procedure Button1Click(Sender: TObject); {әдіс}

procedure FormActivate(Sender: TObject); {әдіс}

Private

{ Private declarations }

Public

{ Public declarations }

End;

Var

Form1: TForm1;

i: Integer;

Implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject); {әдістің сипатталынуы}

Begin

L1.Caption:= DateTimeToStr(Date);

L2.Caption:= TimeToStr(Time);

end;

procedure TForm1.FormActivate(Sender: TObject); {әдістің сипатталынуы}

Begin

i:=125;

end;

End.

2.4 Кластың өрістері

Өріс деп кластағы инкапсуляцияланған берілгендерді айтамыз. Кластың өрістері жазбаның өрістері сияқты, бірақ айырмашылығы олар кез – келген типті болуы мүмкін, сонымен қатар кез – келген класс та бола алады, мысалы:

Type

TChildClass = class(TObject) { TChildClass класын жариялау}

FOne: integer; {бүтін типтің өрісі}

FTwo: String; {жолдық типтің өрісі}

FThree: TObject; { TObject класс өрісінің типі}

End;

Ерер арғы тегі TObject класы болса, онда тақырыпта оны түсіруге болады.

Инкапсуляция принципі бойынша өрістерге қатынау кластың әдістері мен қасиеттерінің көмегімен жүзеге асырылады. Сонымен бірге Object Pascal - да өрістерге тікелей қатынауға да мүмкіндік берілген. Өріске қатынау үшін құрамды ат жазу қажеттігі туады, ол нүкте арқылы ажыратылған кластың аты мен өрістің атынан тұрады, мысалы:



Var

MyObject : TChildClass;

Begin

MyObject := 16;

MyObject := ’Некоторое строковое значение’;

end;

Ұрпақ – класының өзінің арғы – тегінің барлық өрістеріне қатынауға мүмкіндігі бар, бірақ оларға қол жеткізу мүмкін емес болғандықтан, оларды анықтауға болмайды. Мысалы:

Type

TPredok = class{арғы тек класын жариялау}

Value: Integer;

End;

TPotomok = class(TPredok) {ұрпақ класын жариялау}

Value: String; {туындау өрісінің қабысуы}

end;

var

My1: TPredok; {класс айнымалысын жариялау (My1 –айнымалы-объект)}

My2: TPotomok; {класс айнымалысын жариялау (My2 – айнымалы-объект)}

Begin

My1 := TPotomok.Create; { TPredok класының объектісін құрады }

My2 := TPotomok.Create; { TPotomok класының объектісін құрады}

My1.Value := 'Hello!'; {қате, TPredok өрісінің типі емес}

My2.Value := 'Hello!'; {дұрыс, Value: String өрісі жұмыс істейді}

My2.Value := 8; {қате: Value: Integer өрісі қалқаланған}

End;

Бұл мысалда екі класс сипатталған: TPredok – арғы тек және TPotomok – ұрпақ кластары. Әр класс біратты әртүрлі типті Value өрісінен тұрады.

Ары қарай var-секциясында әртүрлі class типті екі айнымалы - My1 және My2 жарияланған. Бір қарағанда My1:= TPotomok.Create объектісінің оператор – конструкторы TPotomок типті My1 объектісін құруы мүмкін (оны құруға жады бөледі). Бірақ My1 басқа типті болғандықтан , ол олай емес. Осы себептен конструктор аталық типті объект құрады, яғни TPredok типті объект. Енді келтірілген мысалдардағы бірнеше операторлардағы қателердің көзі түсінікті болды.

2.5 Кластың әдістері

Кластың әдісі болып инкапсуляцияланған процедура мен функция табылады. Бұл бағыныңқы бағдарламалар кәдімгі бағыныңқы бағдарламалар сияқты жарияланады. Әдіс кластың сипаттамасында жеке тақырып ретінде жариялануы керек, ал әдістің коды - implementation секциясында "." символын, әдістің өзінің класына қатысын білдіреді, нұсқау арқылы сипатталған, мысалы:

Type

TMyClass = class(TObject) {класты жариялау}

...

procedure DoSomething; {DoSomething әдісін жариялау}

...

end;

DoSomething әдісіне сипаттама кейінірек модульдің implementation секциясында келтірілуі керек, мысалы:



procedure TMyClass.DoSomething; {тақырыптың түрі: класс. әдіс}

Begin

...

end;

Әдіске қатынағанда құрамды атты немесе With операторын қолдануға болады, мысалы:

 

Type

TChildClass = class(TObject) {класты жариялау}

...

function FirstFunc(x:real):real;

procedure SecondProc;

...

end;

...

Var

MyObject : TChildClass;

y : real;

Begin

...

MyObject.SecondProc; // әдіске қатынаудың екі мысалы

y := MyObject.FirstFunc(3.14); //құрамды аттың көмегімен: класс .әдіс

...

With MyObject do // сол қатынау

begin // With опреаторының көмегімен

SecondProc;

y := FirstFunc(3.14);

end;

...

End;

Класта анықталған әдістер статикалық, виртуальды, динамикалық және абстрактілі болуы мүмкін. Методтың типі оның ұрпақтарымен қалқалану механизмі арқылы анықталады.

Біратты әдістер ұрпақтарда мысалда көрсетілгендей өрістердің қалқалануы сияқты қалқаланады . Мұндай қалқалау статикалық деп аталады. Статикалық әдістер үшін қалқалау компилятор арқылы жүзеге асырылады. Үнсіздікпен класта сипатталған барлық әдістер статикалық болып табылады.

Мүмкіндікті кеңейту үшін жиі динамикалық қалқалау қолданылады. Ол үшін аталық әдіс dinamic (динамикалық әдіс) немесе virtual (виртуальдыәдіс) директивасынан тұруы керек, ал ұрпақ класта қалқалау әдісі - override директивасынан тұруы керек. Мысалы:

Type

TFigure = class

procedure Draw; virtual; {виртуальды әдіс}

end;

TRectangle = class(TFigure)

procedure Draw; override; {қалқалау әдісі}

end;

TEllipse = class(TFigure)

procedure Draw; override; {қалқалау әдісі}

end;

Бұл мысалда TFigure аталық класының Draw виртуальды әдісі жарияланған және екі біратты әдіс TRectangle және TEllipse ұрпақ класына қатысты жарияланған. Соңғылары қалқаланумен жарияланған (override).

Мұндай жариялау керекті мақсатқа жету мақсатында әдістерді қалқалауға мүмкіндік береді:

Var

Figure: TFigure;

Begin

Figure := TRectangle.Create; // кластың данасын құру

Figure.Draw; // TRectangle.Draw әдісін шақыру

Figure.Destroy; // класс данасын жою

Figure := TEllipse.Create; // класс данасын құру

Figure.Draw; // TEllipse.Draw әдісін шақыру

Figure.Destroy; // класс данасын жою

end;

Семантикалық виртуальды және динамикалық әдістер біркелкі жұмыс істейді. Айырмашылығы тек виртуальды әдіс уақытты үнемдеу көз қарасында өте тиімді (есептеу жылдамдығын тиімдейді), ал динамикалық әдіс оперативтік жадыны рациональды қолдануға мүмкіндік береді (сәйкес келетін бағдарламалық кодтың өлшемін тиімдейді). Динамикалық және виртуальды әдістер статикалық әдістен ерекшелігі мынада , аталық әдістер мен ұрпақтар әдістерінің орын ауыстыруы бағдарламаның орындалу барсыныда жүзеге асырылады.

Класта әдіс abstract директивасының көмегімен абстрактілі болып жариялануы мүмкін. Мұндай әдіс виртуальды немесе ддинамикалық әдіс болуы мүмкін, бірақ басқа әдістерден айырмашылығы implementation секциясында өзінің коды болмауы мүмкін. Ол класта анықталады, бірақ ешқандай әрекеттен тұрмайды, ешқашан шақырылмайды және ұрпақтар класында қайтадан анықталуы керек. Абстрактілі әдістен тұратын класс абстрактілі класс деп аиалады. Мұндай кластар мен әдістер ұрпақтар әдістеріне қатынау тәсілін инкапсуляция жасайды, бірақ өздері ештеңе істемейді, мысалы:

procedure DoSomething; virtual; abstract;

Қалқаланбаған абстрактілі әдіске қатынау орындалу уақыты туралы қатені шақырады (run time error), мысалы:

Type

TClass1 = class(TClass0)

...

procedure Paint; virtual; abstract;

end;

TClass2 = class(TClass1)

...

procedure Paint; override;

end;

Var

jClass1: TClass1;

jClass2: TClass2;

Begin

jClass1.Paint; // абстрактілі әдіске қатынау дұрыс емес

jClass2.Paint; // дұрыс

...

end;

Әрбір класс екі ерекше әдістен тұрады – конструктор және деструктор. Конструктор объектіні құру және оны инициализациялау үшін тағайындалған. Мәселен, Object Pascal тілінде объект динамикалық құрылым болып табылады және айнымалы-объект берілгендерден емес оларға сілтемеден тұрады. Конструктор объектіні динамикалық жадыда үлестіреді және объектінің өрісіне алғашқы мәнін меншіктейді. Соған байланысты тізбектелген типтің өрісі алғашқы мән ретінде 0 – ді алады, жолдық тип ретінде – бос жол, нұсқағыш өрістер - nil мәнін, таңдау - өрісі - Unassigned мәнін алады. Одан басқа, конструктор динамикалық жады бөлінгеннен кейін құрылған объектіге сілтемені Self айнымалысына орналастырады. Барлық класс үнсіздікпен Self айнымалысынан тұрады, ол автоматты түрде класта жарияланады.

Деструктор, конструкторға қарама – қарсы ұғым, ол кластың данасын жоюға арналған, яғни жадының объектіні бұзу және жойылатын объектімен бос емес бөлігін босату. TObject базалық класының және оның ұрпақтарында конструктор мен деструктор Create (құру) және Destroy (жою) сәйкес аталады. Бұл класта сонымен қатар Free әдісі жарияланған, ол алдымен адрестің корректілігін тексереді (объект шын мәнінде жүзеге асырылған ба ?) және содан кейін барып қана Destroy әдісін шақырады. Егер объект конструктормен құрылмаған болса, онда деструкторға қатынау ерекше жағдайдың генерациясына әкеп соғады. Мұндай байланыста Destroy әдісінің орнына Free әдісін қолданған жөн болады.

Конструктор мен деструктор процедура болғанымен де, олар арнайы резервтелген сөздермен жарияланады. Конструктор constructor сөзімен, ал деструктор – destructor сөзімен жарияланады.

Type

TSample = class

Text: String;

constructor Create; // кластың данасын құру

destructor Destroy; // кластың данасын

end;

Өріске, қасиеттерге және әдістерге қатынамас бұрын, ең алдымен оларды құру керек. Объектіні құру үшін ең алдымен объектінің класына конструктор-әдісін қолдану қажет:

Var

MyObject: TSample;

Begin

...

MyObject := TSample.Create;

...

end;

Егер ұрпақтар класы құрылып жатса және оны құру кезінде аталық класта жоқ кейбір қосымша әрекеттерді іске асыру көзделсе, онда алдымен өзінің аталығының конструкторын шақыру керек, ал содан кейін барып қосымша әрекеттерді іске асыру қажет. Арғы тектің өрістеріне қатынауды қамтамасыз ету үшін, конструкторда алдын – ала арғы тек класының объектісін құру қажет. Аталық кластың кез – келген қалқаланған әдісін шақыруды резервтелген inherited (иемденген) сөзінің көмегімен іске асырады. Мысалы:

Type

TShape = class(TGraphicControl)

private{ішкі жариялау}

FPen: TPen;

FBrush: TBrush;

procedure PenChanged(Sender: TObject);

procedure BrushChanged(Sender: TObject);

public{сыртқы жариялау}

constructor Create(Owner: TComponent); override;

destructor Destroy; override;

...

end;

...

constructor TShape.Create(Owner: TComponent);

Begin

inherited Create(Owner); // TGraphicControl арғы тек класының объектісін құру

Width := 65; // TGraphicControl иемденген қасиетін өзгерту

Height := 65;

FPen := TPen.Create; // class TPen типі бар жеке өрісті құру

FPen.OnChange := PenChanged;

FBrush := TBrush.Create; // class TBrush типі бар жеке өрісті құру

FBrush.OnChange := BrushChanged;

end;

Кейбір қарапайым кластар конструкторды немесе деструкторды жарияламай – ақ, құрылуы немесе жойылуы мүмкін. Мысалы, класс TObject, класының ұрпағы болып келсе, онда мұнда Constructor мен Destructor - ды жариялаудың қажеті жоқ:

Type

TClassy = class;

...

Var

Classy: TClassy;

...

Classy:= TClassy.Create; {объектіні құру}

...

Classy:= TClassy.Free; {объектіні жою}

Тілде бір класс аралығында бір атпен бірнеше әдісті жариялау мүмкіндігі бар. Осыдан кез – келген осындай әдіс қайта іске қосылатын болуы керек (overload директивасы). Компилятор мұндай әдістерді өзінің тиімді формальды параметрлерінің жиынымен идентификациялайды. Сол атпен пайда болған әдіске Delphi компиляторының реакциясын орындатпау үшін, әрбір осындай әдісті reintroduce директивасымен белгілеп қою керек.Ары қарай implementation секциясында осындай барлық әдістердің қодтарын енгізу керек. Мысалы:

Type

TClassy = class;

Procedure HH(i, j: byte; var s: String); reintroduce; overload;

Procedure HH(q: String); reintroduce; overload;

Procedure HH(a: array of Integer); reintroduce; overload;

End;

...








Date: 2015-07-01; view: 780; Нарушение авторских прав



mydocx.ru - 2015-2021 year. (0.025 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию