• II.bob. Statik va Dinamik polimorfizm
  • Matematika va kompyuter ilmlari fakulteti amaliy matimatika kafedrasi dasturlash asoslari fanidan




    Download 114,28 Kb.
    bet6/11
    Sana17.05.2024
    Hajmi114,28 Kb.
    #239885
    1   2   3   4   5   6   7   8   9   10   11
    Bog'liq
    KURS IWI

    Qayta yuklash metodlari
    Bir xil metod nomi uchun har xil doirada bir nechta metod ta’riflariga ega bo‘lishi mumkin. Metodlarni qayta yuklash - bir-biridan turlari va yoki argumentlar ro‘yxatidagi argumentlar soni bo‘yicha farq qilishi kerak. Faqat qaytarish turidan farq qiladigan metod e’lonlarini qayta yuklab bo‘lmaydi.
    Quyidagi misol har xil turdagi ma’lumotlarni chop etish uchun print() metodidan foydalanilish keltirilgan:
    using System;
    namespace PolymorphismApplication {
    class Printdata {
    void print(int i) {
    Console.WriteLine("int turida chop etish: {0}", i );
    }
    void print(double f) {
    Console.WriteLine("float turida chop etish: {0}" , f);
    }
    void print(string s) {
    Console.WriteLine("string turida chop etish: {0}", s);
    }
    static void Main(string[] args) {
    Printdata p = new Printdata();
    // Butun sonni chop etish uchun print() ga murojaat qilish
    p.print(5);
    // Haqiqiy sonni chop etish uchun print() ga murojaat qilish
    p.print(500.263);
    // Satrni chop etish uchun print() ga murojaat qilish
    p.print("Hello C#");
    Console.ReadKey();
    }
    }
    }
    Yuqoridagi kod kompilyatsiya qilingan va bajarilganida, u quyidagi natijani beradi:
    int turida chop etish: 5
    float turida chop etish: 500.263
    string turida chop etish: Hello C#

    II.bob. Statik va Dinamik polimorfizm

    2.1. Statik polimorfizm.


    Ushbu tur kompilyatsiya vaqti polimorfizmi (Compile Time Polymorphism) deb ham yuritiladi. Chunki u qaysi metod yoki funksiyani chaqirishni kompilyatsiya vaqtida aniqlashtirib oladi va mos keladigan metod yoki funksiya topilmasa xatolik qaytariladi.
    Quyida “Algebra” sinfida bir xil nomga ega ikkita “Add” metodi mavjud va bu metodlar faqat parametrlari bilan farqlangan. 1 – “Add” metodining vazifasi 2 ta butun sonni qabul qilib, ularning yig’indisini qaytarish. 2 – “Add” metodining vazifasi 3 ta butun sonni qabul qilib, ularning yig’indisini qaytarish.

    class Algebra
    {
    public int Add(int a, int b)
    {
    return a + b;
    }
    public int Add(int a, int b, int c)
    {
    return a + b + c;
    }
    }
    Keling endi dastur qanday ishlashini yaxshiroq tushunish uchun, “Algebra” sinfining “Add” metodidan ikki xil ko’rinishidan ham foydalanib ko’ramiz:
    class Algebra
    {
    public int Add(int a, int b)
    {
    return a + b;
    }


    public int Add(int a, int b, int c)
    {
    return a + b + c;
    }
    }


    class Program
    {
    static void Main(string[] args)
    {
    Algebra algebra = new Algebra();
    Console.WriteLine(algebra.Add(3, 8)); //output: 11
    Console.WriteLine(algebra.Add(2, 3, 8)); //output: 13
    Console.ReadKey();
    }
    }
    Biz sinf metodiga algebra.Add(3, 8) shaklida murojaat qildik va kompilyastiya jarayoni boshlangandan keyin dastur ikkita parametrli metodga ya’ni 1 – “Add” metodiga murojaat qildi. (Mustaqil tarzda s.Add(2, 3, 5) holatini o’rganib chiqing). Biz statik polimorfizmda bir metodni sinfni o’zida qayta aniqladik va qaysi metod ishlashi kerak ekanligi kompilyatsiya vaqtida aniq bo’ldi. Statik polimorfizm. Ushbu tur kompilyatsiya vaqti polimorfizmi (CompileTime Polymorphism) deb ham yuritiladi. Chunki u qaysi metod yoki funksiyani chaqirishni kompilyatsiya vaqtida aniqlashtirib oladi va mos keladigan metod yoki funksiya topilmasa xatolik qaytariladi.
    Quyida “Algebra” sinfida bir xil nomga ega ikkita “Add” metodi mavjud va bu metodlar faqat parametrlari bilan farqlangan.
    1 – “Add” metodining vazifasi 2 ta haqiqiy sonni qabul qilib, ularning yig’indisini qaytarish.
    2 – “Add” metodining vazifasi 4 ta haqiqiy sonni qabul qilib, ularning yig’indisini qaytarish.
    namespaceUzbekDevs
    {
    classAlgebra
    {
    publicdouble Add(double a, double b)
    {
    return a + b;
    }
    publicdouble Add(double a, double b, double c, double d)
    {
    return a + b + c + d;
    }
    }
    }Keling endi dastur qanday ishlashini yaxshiroq tushunish uchun, “Algebra” sinfining “Add” metodidan ikki xil ko’rinishidan ham foydalanib ko’ramiz:
    namespace UzbekDevs
    {
    class Algebra
    {
    public double Add(double a, double b)
    {
    return a + b;
    }
    public double Add(double a, double b, double c, double d)
    {
    return a + b + c + d;
    }
    }
    class Program
    {
    static void Main(string[] args)
    {
    Algebra algebra = new Algebra();
    Console.WriteLine(algebra.Add(4, 23)); //chiquvchi qiymat: 27
    Console.WriteLine(algebra.Add(4, 3, 12, 20)); //chiquvchi qiymat: 39
    Console.ReadKey();
    }
    }
    }
    Biz sinf metodiga algebra.Add(4, 23) shaklida murojaat qildik va kompilyastiya jarayoni boshlangandan keyin dastur ikkita parametrli metodga ya’ni 1 – “Add” metodiga murojaat qildi. Biz statik polimorfizmda bir metodni sinfni o’zida qayta aniqladik va qaysi metod ishlashi kerak ekanligi kompilyatsiya vaqtida aniq bo’ldi.
    2.2.Dinamik polimorfizm.
    Runtime polimorfizmi yoki kech ulanish polimorfizmi deb ham atash mumkin. Polimorfizmning ushbu turida statik polimorfizmdan farqli tarzda bir sinfga tegishli metodlarni ushbu sinfdan voris oluvchi boshqa sinflarda qayta aniqlaymiz. Bu nima degani ? Misol tariqasida real bir voqeani qaraymiz. Geometrik shakl deganimizda uchuburchak, to’rtburchak, piramida va yana boshqa shakllar ko’z oldimizdan o’tadi. Lekin aynan bir shaklni tasavvur qila olmaymiz. Uchburchak deganimizda esa aksincha. Ushbu holat quyidagicha:

    class Shakl
    {
    public void Chizish()
    {
    Console.WriteLine("Men shakl chizaman");
    }
    }


    class Uchburchak : Shakl
    {
    public void Chizish()
    {
    Console.WriteLine("Men uchburchak chizaman");
    }
    }


    class Aylana : Shakl
    {
    public void Chizish()
    {
    Console.WriteLine("Men aylana chizaman");
    }
    }
    Yuqoridagi holatda “Shakl” sinfi ajdod sinf va unda Chizish() metodi mavjud, “Aylana” va “Uchburchak” sinflari esa uning voris sinflari va Chizish() metodini esa ularda qayta yozdik.

    class Shakl
    {
    public void Chizish()
    {
    Console.WriteLine("Men shakl chizaman");
    }
    }


    class Uchburchak : Shakl
    {
    public void Chizish()
    {
    Console.WriteLine("Men uchburchak chizaman");
    }
    }


    class Aylana : Shakl
    {
    public void Chizish()
    {
    Console.WriteLine("Men aylana chizaman");
    }
    }


    class Program
    {
    static void Main(string[] args)
    {
    //konstruktorlar e'loni
    Shakl shakl = new Shakl();
    Shakl uchburchak = new Uchburchak();
    Shakl aylana = new Aylana();
    //Metodni chaqirish
    shakl.Chizish();
    uchburchak.Chizish();
    aylana.Chizish();


    Console.ReadKey();
    }
    }
    Natija qanday bo’ladi ?

    Natija
    Nega natija biz o’ylagandek chiqmadi ? Biz yuqorida ikkita xatoga yo’l qo’ydik.

    Download 114,28 Kb.
    1   2   3   4   5   6   7   8   9   10   11




    Download 114,28 Kb.

    Bosh sahifa
    Aloqalar

        Bosh sahifa



    Matematika va kompyuter ilmlari fakulteti amaliy matimatika kafedrasi dasturlash asoslari fanidan

    Download 114,28 Kb.