24-mavzu. Polimorfizm
Download 126.11 Kb.
|
30-maruza
- Bu sahifa navigatsiya:
- Polimorfizm sozi kop shakllarga ega bolishni
public class X
{ public virtual void A() { } } public class Y : X { public override void A() { } } Olingan sinf bekor qilingan a'zoni “sealed" deb e'lon qilish orqali virtual merosni to'xtata oladi. public class Y : X { public sealed override void A() { } } Asosiy sinf virtual a'zosiga kirish "base" kalit so'zidan foydalanib, olingan sinf usulga kirishi mumkin. public class X { public virtual void A() { } } public class Y : X { public override void A() { base.A(); } } Xulosa Polimorfizmning ma'nosi bir nechta shaklga ega bo'lgan bir nomdir. Quyida polimorfizmning ikki turi mavjud: Statik yoki kompilyatsiya vaqti polimorfizmi (masalan, usulning haddan tashqari yuklanishi va operatorning ortiqcha yuklanishi). Dinamik yoki ish vaqti polimorfizmi (masalan, bekor qilish). Usulni bekor qilish soyadan farq qiladi. "Yangi" kalit so'zidan foydalanib, biz asosiy sinf a'zosini yashirishimiz mumkin. Biz olingan sinfning virtual a'zolarni bekor qilishini oldini olishimiz mumkin. Biz olingan sinfdan asosiy sinf virtual a'zosiga kira olamiz. Polimorfizm so'zi ko'p shakllarga ega bo'lishni anglatadi. Ob'ektga yo'naltirilgan dasturlash paradigmasida polimorfizm ko'pincha "bitta interfeys, bir nechta funksiya" sifatida ifodalanadi. Polimorfizm statik yoki dinamik bo'lishi mumkin. Statik polimorfizmda funksiyaga javob kompilyatsiya vaqtida aniqlanadi. Dinamik polimorfizmda bu ish vaqtida hal qilinadi. Statik polimorfizm Kompilyatsiya vaqtida funksiyani ob'ekt bilan bog'lash mexanizmi erta bog'lanish deb ataladi. U statik bog'lanish deb ham ataladi. C# statik polimorfizmni amalga oshirish uchun ikkita texnikani taqdim etadi. Ular - Funktsiyaning haddan tashqari yuklanishi Operatorning haddan tashqari yuklanishi Operatorning haddan tashqari yuklanishini keyingi bobda muhokama qilamiz. Funktsiyani haddan tashqari yuklash Xuddi shu doirada bir xil funktsiya nomi uchun bir nechta ta'riflarga ega bo'lishingiz mumkin. Funktsiyaning ta'rifi bir-biridan argumentlar ro'yxatidagi argumentlar turlari va/yoki soni bilan farq qilishi kerak. Siz faqat qaytish turiga qarab farq qiluvchi funksiya deklaratsiyasini ortiqcha yuklay olmaysiz. Quyidagi misol turli xil ma'lumotlar turlarini chop etish uchun print() funksiyasidan foydalanishni ko'rsatadi – using System; namespace PolymorphismApplication { class Printdata { void print(int i) { Console.WriteLine("Printing int: {0}", i ); } void print(double f) { Console.WriteLine("Printing float: {0}" , f); } void print(string s) { Console.WriteLine("Printing string: {0}", s); } static void Main(string[] args) { Printdata p = new Printdata(); // Call print to print integer p.print(5); // Call print to print float p.print(500.263); // Call print to print string p.print("Hello C++"); Console.ReadKey(); } } } Printing int: 5 Printing float: 500.263 Printing string: Hello C++ Dinamik polimorfizm C# interfeysning qisman sinfini amalga oshirishni ta'minlash uchun ishlatiladigan mavhum sinflarni yaratishga imkon beradi. Olingan sinf undan meros bo'lganda amalga oshirish tugallanadi. Abstrakt sinflar mavhum usullarni o'z ichiga oladi, ular hosila sinf tomonidan amalga oshiriladi. Olingan sinflar ko'proq maxsus funktsiyalarga ega. Mana mavhum sinflar haqidagi qoidalar – Siz mavhum sinfning namunasini yarata olmaysiz Siz mavhum sinfdan tashqari mavhum usulni e'lon qila olmaysiz Agar sinf muhrlangan deb e'lon qilingan bo'lsa, uni meros qilib bo'lmaydi, mavhum sinflarni muhrlangan deb e'lon qilib bo'lmaydi. Quyidagi dastur mavhum sinfni ko'rsatadi – using System; namespace PolymorphismApplication { abstract class Shape { public abstract int area(); } class Rectangle: Shape { private int length; private int width; public Rectangle( int a = 0, int b = 0) { length = a; width = b; } public override int area () { Console.WriteLine("Rectangle class area :"); return (width * length); } } class RectangleTester { static void Main(string[] args) { Rectangle r = new Rectangle(10, 7); double a = r.area(); Console.WriteLine("Area: {0}",a); Console.ReadKey(); } } } Rectangle class area : Area: 70 Agar siz meros qilib olingan sinf(lar)da amalga oshirilmoqchi bo'lgan sinfda belgilangan funksiyaga ega bo'lsangiz, siz virtual funktsiyalardan foydalanasiz. Virtual funktsiyalar turli meros qilib olingan sinflarda boshqacha tarzda amalga oshirilishi mumkin va bu funktsiyalarga qo'ng'iroq qilish ish vaqtida hal qilinadi. Dinamik polimorfizm mavhum sinflar va virtual funktsiyalar tomonidan amalga oshiriladi. Quyidagi dastur buni ko'rsatadi – using System; namespace PolymorphismApplication { class Shape { protected int width, height; public Shape( int a = 0, int b = 0) { width = a; height = b; } public virtual int area() { Console.WriteLine("Parent class area :"); return 0; } } class Rectangle: Shape { public Rectangle( int a = 0, int b = 0): base(a, b) { }
Console.WriteLine("Rectangle class area :"); return (width * height); } } class Triangle: Shape { public Triangle(int a = 0, int b = 0): base(a, b) { } public override int area() { Console.WriteLine("Triangle class area :"); return (width * height / 2); } } class Caller { public void CallArea(Shape sh) { int a; a = sh.area(); Console.WriteLine("Area: {0}", a); } } class Tester { static void Main(string[] args) { Caller c = new Caller(); Rectangle r = new Rectangle(10, 7); Triangle t = new Triangle(10, 5); c.CallArea(r); c.CallArea(t); Console.ReadKey(); } } } Rectangle class area: Area: 70 Triangle class area: Area: 25 Download 126.11 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling