Polimorfizm – bu mazmunan bir о„xshash masalalarni turli usulda yechishdir. Sinflar shajarasida u yoki bu metodning algoritmini о„zgartirish orqali programma tuzuvchi avlod metodlarga ularning ajdodlarida bо„lmagan xususiyatlarni berishi mumkin. Metodni о„zgartirish uchun avlod sinfda bu metodni «yopish» kerak, ya‟ni avlodda xuddi shu nomdagi metod e‟lon qilinishi kerak va unda zarur amallarni bajarish kerak. Natijada ajdod va avlod obyektlarda ikkita bir xil nomdagi, lekin har xil algoritmga asoslangan metodlar amal qiladi. Bunga obyektlar polimorfizmi deyiladi.
Polimorfizmni amalga oshirish uchun ajdod sinfda metod virtual deb, ajdod sinflardagi mos metodlar override (qoplovchi) deb e‟lon qilinishi kerak. Bu kо„rsatmalarni olgan kompilyator ajdod sinf VMT - virtual metodlar jadvaliga avlod sinfdagi metodga kirish nuqtasini joylashtiradi va ajdod sinfga yangi metod bilan ishlash imkoniyatini beradi.
Har qanday sinf tarkibiga ikkita maxsus sinf kiradi – konstruktor (constructor) va destruktor (destructor). TObject sinfida bu metodlar mos ravishda Create va Destroy metodlaridir. Konstruktor obyektni yaratadi, ya‟ni uni dinamik xotirada joylashtiradi (joy ajratadi) va xotira adresini sinfda avtomatik ravishda aniqlanadigan Self о„zgaruvchisiga beradi. Destruktor obyektni uyumdan о„chiradi. Konstruktor va destruktorlar protseduralar bо„lib Constructor va Destructor sо„zlari bilan e‟lon qilinadi.
Type
TSinf = Class
Butun_Uzg : Integer;
Constructor Create;
Destructor Destroy;
end;
Obyekt maydonlariga faqat obyekt yaratilgandan keyin murojaat qilish mumkin.
Var
VObj : TSinf;
Begin
VObj.Butun_Uzg := 10; // xato
VObj : = Tsinf.Create;
VObj.Butun_Uzg := 10; // tо„g„ri
...
VObj.Destroy; end;
TObject sinfida Free metodi aniqlangan bо„lib, u obyekt adresini ayni paytda mavjudligi tekshirida va keyin Destroy metodini chaqiradi. Odatda Free metodi obyektni ikkinchi marta о„chirishga harakat qilishi bilan bog„liq programma bajarilishining favqulotda tо„xtash bilan bog„liq holatlarini oldini olish uchun ishlatiladi.
Polimorfizmni amal qilishini misolda kо„rishimiz mumkin. Ikkita ajdod (Tasvir_1) va avlod (Tasvir_2) sinflarni yaratilgan bо„lib, ajdod sinfda biror tasvirni kо„rsatish va yashirish amallarini bajaruvchi Kursat va Yashir metodlari mavjud bо„lsin. Bu metodlar о„z navbatida mantiqiy parametrli Chiz metodiga murojaat qilsin. Chiz metodi ajdod va avlod sinflarida turlicha amalga oshirilgan va mos ravishda tо„rtburchak va aylana tasvirlarini chizadi (о„chirish tasvirni fon rangida chizish bilan amalga oshiriladi). Natijada sinflar shajarasida Kursat va
Yashir metodlari har xil tasvirlarni kо„rsatadi va yashiradi.
Polimorfizm namoyon bо„lishining ikkinchi kо„rinishi sinflardan tashqarida yaratilgan Polimorfizm protsedurasi orqali amalga oshirilgan. U Tasvir_1 turidagi (Tasvir) ramziy parametrga ega, murojaat paytida ushbu parametrga mos amaldagi sinf obyektiga mos ravishda Chiz metodi chaqiriladi: Tasvir.Chiz(Bor_Yoq).
Mos ilovaning kо„rinishilari va matni quyida keltirilgan.
a) tasvirlarni kо„rsatish; b) tasvirlarni о„chirish:
2-rasm. Shakl chizish protsedurasi misolida polimorfizm.
unit Unit1; interface
…
Type
TTasvir_1 = Class(TWinControl)
public
Procedure Yashir;
Procedure Kursat;
Procedure Chiz(Bor_Yoq: Boolean); Virtual; end;
TTasvir_2 = Class(TTasvir_1) public
Procedure Chiz(Bor_Yoq: Boolean); override;
End; var
Form1: TForm1;
Tasvir1 :TTasvir_1;
Tasvir2 :TTasvir_2;
Implementation
Procedure TTasvir_1.Kursat;
Begin Chiz(True) end;
Procedure TTasvir_1.Yashir;
Begin Chiz(False) end;
Procedure TTasvir_1.Chiz(Bor_Yoq: Boolean);
Begin
With Form1.Canvas Do
Begin
If Bor_Yoq Then
Begin Pen.Color := ClRed;
Brush.Color :=ClRed
End
Else
Begin
Pen.Color := Form1.Color;
Brush.Color :=Form1.Color
End;
Rectangle(100,100,200,200);
End;
End;
Procedure TTasvir_2.Chiz(Bor_Yoq: Boolean);
Begin
With Form1.Canvas Do
Begin
If Bor_Yoq Then
Begin
Pen.Color := ClRed;
Brush.Color :=ClRed
End
Else
Begin
Pen.Color := Form1.Color;
Brush.Color :=Form1.Color
End;
Ellipse(400,100,500,200);
End;
End;
Procedure Polimorfizm(Tasvir : TTasvir_1; Bor_Yoq: Boolean);
Begin
Tasvir.Chiz(Bor_Yoq);
End; {$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin
Tasvir1 :=TTasvir_1.Create(Form1); Tasvir2 :=TTasvir_2.Create(Form1);
end;
procedure TForm1.Show_Tasvir1Click(Sender: TObject); begin Tasvir1.Kursat; end;
procedure TForm1.Hide_Tasvir1Click(Sender: TObject); begin Tasvir1.Yashir; end;
procedure TForm1.Show_Tasvir2Click(Sender: TObject); begin
Polimorfizm(Tasvir2,True); end;
procedure TForm1.Hide_Tasvir2Click(Sender: TObject); begin
Polimorfizm(Tasvir2,False);
end; end.
Do'stlaringiz bilan baham: |