2.2 Инкапсуляция, туындау және полиморфизм
Класс - өріс, әдіс және қасиетті өзіне бүтіндей қоса отырып, жеке тапсырмаларды шешуге тағайындалған, аяқталған құрылымдық бірлік болып табылады. Әдетте мұндай тапсырма шешімі қандай да бір мәселелер жетегінің айналымында табылатын тапсырма болады. TRichEdit класы rtf-файлдардың (Rich Text Format форматындағы файл) қуатты мәтіндік редакторын береді, ол файлды көруді және редактрлеуді ұйымдастыруға, қаріптің өлшемі мен типін сақтау мен өзгертуге, символдар жолын іздеуге және т.б. тағайындалған. Өріс, әдіс және қасиеттің мұндай бүтіндігін инкапсуляция деп атаймыз.
Бұл тілде көптеген кластар бар (300 – ге жуық ), олар Delphi ортасын қолданатын бағдарламашыға арналып Object Pascal тілінің құрауыштарымен - Inprise International фирмасының қызметкерлерінің көмегімен құрылған.
Программист, бағдарламаны құра отырып өзінің пайдаланушы класын құрады. Мұндай кластар не айқын емес құрылады, онда программист Delphi ортасының көрнекілік құралдарын қолданады, ал кластың мәтінін Delphi өзі құрастырады, немесе айқын, онда программист кластың кодын Object Pascal тілінің құралдарымен өзі жазады.
Жаңа класс басқа қарапайым кластың негізінде құрылады. Ол үшін кластың тақырыбында оның аталық класын көрсету керек. Жаңа кластың тақырыбының синтаксисі мынандай түрде болады:
type className = class (ancestorClass)
мұнда className – жаңа кластың аты; ancestorClass – аталық кластың аты. Жаңа класс автоматты түрде өзінің аталық класының өрісін, әдісін және қасиеттерін иемденеді және өзінің өрісі, әдісі және қасиеттерімен толықтырылады. Кластың бұл қасиеті туындау деп аталады. Туындаудың көмегімен қарапайымнан қиынға өту әдісі арқылы, қандай болса да қиын дәрежедегі класты құруға болады. Қарапайым класс болып TObject табылады, ол өріс пен қасиеттен тұрмайды, бірақ кластың данасын құратын, жоятын, осы класқа қызмет көрсету және бағдарламаны қалыпты функциялауға арналған қандай да әдістердің жиынынан тұрады. Осының негізінде барлық аталық класқа ортақ кластың туындау ағашы құрастырылады. Мысалы:
type TPersistent = class (TObject),
type TComponent = class (TPersistent),
type TControl = class (TComponent).
Кейде аталық класта сипатталған әдістер қандай да бір себепке байланысты ұрпақ класты қанағаттандырмайды. Мұндай жағдайда ұрпақ класта аталық класта жазылғандай атпен әдіс құруға болады, бірақ жұмыс істеу принципі басқадай болады. Осыдан екі класта да бір атпен әртүрлі әдістер әрекет жасайтын болады. Полиморфизм бұл біратты әдістерді жариялауға мүмкіндігі бар туыс кластардың қасиеті.
2.3 Кластың синтаксисі
Барлық кластың синтаксисі мынандай түрде болады:
type
ClassName = class (AncestorClass)
MemberList
end;
мұнда ClassName – кластың аты; class – кілттік сөз; AncestorClass – аталық кластың типі; MemberList – өрістер, әдістер және қасиеттердің тізімі. Төменде TForm1 класынан тұратын main модулінің мәтіні көрсетілген.
unit Main;
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 типті объект. Енді келтірілген мысалдардағы бірнеше операторлардағы қателердің көзі түсінікті болды.
Достарыңызбен бөлісу: |