O'zbek

Obyektga yo'naltirilgan dasturlashning asosiy tushunchasi bo'lgan polimorfizmni o'rganing. Dunyo dasturchilari uchun amaliy misollar bilan kodning moslashuvchanligi, qayta ishlatilishi va qo'llab-quvvatlanishini qanday yaxshilashini bilib oling.

Polimorfizmni Tushunish: Global Dasturchilar uchun To'liq Qo'llanma

Yunoncha "poly" ("ko'p" degan ma'noni anglatadi) va "morph" ("shakl" degan ma'noni anglatadi) so'zlaridan olingan polimorfizm obyektga yo'naltirilgan dasturlashning (OYD) tamal toshidir. U turli sinflardagi obyektlarga bir xil metod chaqiruviga o'ziga xos usullar bilan javob berish imkonini beradi. Ushbu asosiy tushuncha kodning moslashuvchanligini, qayta ishlatilishini va qo'llab-quvvatlanishini yaxshilaydi, bu esa uni butun dunyo dasturchilari uchun ajralmas vositaga aylantiradi. Ushbu qo'llanma polimorfizm, uning turlari, afzalliklari va turli dasturlash tillari va ishlab chiqish muhitlarida aks etadigan misollar bilan amaliy qo'llanilishi haqida to'liq ma'lumot beradi.

Polimorfizm nima?

Asosan, polimorfizm bitta interfeysga bir nechta turni ifodalash imkonini beradi. Bu shuni anglatadiki, siz turli sinflardagi obyektlar bilan ishlaydigan kodni go'yo ular umumiy turdagi obyektlardek yozishingiz mumkin. Bajariladigan amaldagi xatti-harakat ish vaqtidagi aniq obyektga bog'liq. Aynan shu dinamik xatti-harakat polimorfizmni shunchalik kuchli qiladi.

Oddiy o'xshatishni ko'rib chiqing: Tasavvur qiling, sizda "play" tugmasi bo'lgan masofadan boshqarish pulti bor. Bu tugma turli xil qurilmalarda ishlaydi - DVD pleyer, striming qurilmasi, CD pleyer. Har bir qurilma "play" tugmasiga o'ziga xos tarzda javob beradi, lekin siz faqat tugmani bosish ijroni boshlashini bilishingiz kerak. "Play" tugmasi polimorfik interfeysdir va har bir qurilma bir xil harakatga javoban turli xil xatti-harakatlarni (shakllarni) namoyon etadi.

Polimorfizm turlari

Polimorfizm ikki asosiy shaklda namoyon bo'ladi:

1. Kompilyatsiya vaqtidagi polimorfizm (Statik polimorfizm yoki Overloading)

Kompilyatsiya vaqtidagi polimorfizm, shuningdek, statik polimorfizm yoki overloading (qayta yuklash) deb ham ataladi, kompilyatsiya bosqichida hal qilinadi. U bir xil sinf ichida bir xil nomga ega, ammo har xil signaturalarga (parametrlarning soni, turi yoki tartibi har xil) ega bo'lgan bir nechta metodlarga ega bo'lishni o'z ichiga oladi. Kompilyator funksiya chaqiruvi paytida taqdim etilgan argumentlarga asoslanib qaysi metodni chaqirishni aniqlaydi.

Misol (Java):


class Calculator {
    int add(int a, int b) {
        return a + b;
    }

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

    double add(double a, double b) {
        return a + b;
    }

    public static void main(String[] args) {
        Calculator calc = new Calculator();
        System.out.println(calc.add(2, 3));       // Natija: 5
        System.out.println(calc.add(2, 3, 4));    // Natija: 9
        System.out.println(calc.add(2.5, 3.5));   // Natija: 6.0
    }
}

Ushbu misolda, Calculator sinfida add nomli uchta metod mavjud bo'lib, har biri har xil parametrlarni qabul qiladi. Kompilyator uzatilgan argumentlarning soni va turlariga qarab tegishli add metodini tanlaydi.

Kompilyatsiya vaqtidagi polimorfizmning afzalliklari:

2. Ish vaqtidagi polimorfizm (Dinamik polimorfizm yoki Overriding)

Ish vaqtidagi polimorfizm, shuningdek, dinamik polimorfizm yoki overriding (qayta yozish) deb ham ataladi, bajarilish bosqichida hal qilinadi. U super sinfda bir metodni aniqlashni va keyin bir yoki bir nechta quyi sinflarda o'sha metodning boshqa implementatsiyasini taqdim etishni o'z ichiga oladi. Qaysi metod chaqirilishi kerakligi ish vaqtida haqiqiy obyekt turiga qarab aniqlanadi. Bunga odatda vorislik va virtual funksiyalar (C++ kabi tillarda) yoki interfeyslar (Java va C# kabi tillarda) orqali erishiladi.

Misol (Python):


class Animal:
    def speak(self):
        print("Umumiy hayvon ovozi")

class Dog(Animal):
    def speak(self):
        print("Vov!")

class Cat(Animal):
    def speak(self):
        print("Miyov!")

def animal_sound(animal):
    animal.speak()

animal = Animal()
dog = Dog()
cat = Cat()

animal_sound(animal)  # Natija: Umumiy hayvon ovozi
animal_sound(dog)     # Natija: Vov!
animal_sound(cat)     # Natija: Miyov!

Ushbu misolda, Animal sinfi speak metodini aniqlaydi. Dog va Cat sinflari Animal dan vorislik oladi va speak metodini o'zlarining maxsus implementatsiyalari bilan qayta yozadi. animal_sound funksiyasi polimorfizmni namoyish etadi: u Animal dan olingan har qanday sinf obyektlarini qabul qilishi va speak metodini chaqirishi mumkin, bu esa obyekt turiga qarab turli xil xatti-harakatlarga olib keladi.

Misol (C++):


#include 

class Shape {
public:
    virtual void draw() {
        std::cout << "Shakl chizilmoqda" << std::endl;
    }
};

class Circle : public Shape {
public:
    void draw() override {
        std::cout << "Aylana chizilmoqda" << std::endl;
    }
};

class Square : public Shape {
public:
    void draw() override {
        std::cout << "Kvadrat chizilmoqda" << std::endl;
    }
};

int main() {
    Shape* shape1 = new Shape();
    Shape* shape2 = new Circle();
    Shape* shape3 = new Square();

    shape1->draw(); // Natija: Shakl chizilmoqda
    shape2->draw(); // Natija: Aylana chizilmoqda
    shape3->draw(); // Natija: Kvadrat chizilmoqda

    delete shape1;
    delete shape2;
    delete shape3;

    return 0;
}

C++ da virtual kalit so'zi ish vaqtidagi polimorfizmni yoqish uchun juda muhimdir. U bo'lmasa, obyektning haqiqiy turidan qat'i nazar, har doim asosiy sinfning metodi chaqiriladi. override kalit so'zi (C++11 da kiritilgan) hosila sinf metodi asosiy sinfdagi virtual funksiyani qayta yozish uchun mo'ljallanganligini aniq ko'rsatish uchun ishlatiladi.

Ish vaqtidagi polimorfizmning afzalliklari:

Interfeyslar orqali polimorfizm

Interfeyslar polimorfizmga erishish uchun yana bir kuchli mexanizmni taqdim etadi. Interfeys sinflar amalga oshirishi mumkin bo'lgan shartnomani belgilaydi. Bir xil interfeysni amalga oshiradigan sinflar interfeysda belgilangan metodlar uchun implementatsiyalarni taqdim etishi kafolatlanadi. Bu sizga turli sinflardagi obyektlarni go'yo ular interfeys turidagi obyektlardek ishlatish imkonini beradi.

Misol (C#):


using System;

interface ISpeakable {
    void Speak();
}

class Dog : ISpeakable {
    public void Speak() {
        Console.WriteLine("Vov!");
    }
}

class Cat : ISpeakable {
    public void Speak() {
        Console.WriteLine("Miyov!");
    }
}

class Example {
    public static void Main(string[] args) {
        ISpeakable[] animals = { new Dog(), new Cat() };
        foreach (ISpeakable animal in animals) {
            animal.Speak();
        }
    }
}

Ushbu misolda, ISpeakable interfeysi bitta Speak metodini belgilaydi. Dog va Cat sinflari ISpeakable interfeysini amalga oshiradi va Speak metodining o'z implementatsiyalarini taqdim etadi. animals massivi ham Dog, ham Cat obyektlarini saqlashi mumkin, chunki ikkalasi ham ISpeakable interfeysini amalga oshiradi. Bu sizga massiv bo'ylab harakatlanish va har bir obyektda Speak metodini chaqirish imkonini beradi, bu esa obyekt turiga qarab turli xil xatti-harakatlarga olib keladi.

Polimorfizm uchun interfeyslardan foydalanishning afzalliklari:

Abstrakt sinflar orqali polimorfizm

Abstrakt sinflar to'g'ridan-to'g'ri nusxa (instansiya) olinmaydigan sinflardir. Ular ham konkret metodlarni (implementatsiyaga ega metodlar), ham abstrakt metodlarni (implementatsiyaga ega bo'lmagan metodlar) o'z ichiga olishi mumkin. Abstrakt sinfning quyi sinflari abstrakt sinfda belgilangan barcha abstrakt metodlar uchun implementatsiyalarni taqdim etishi shart.

Abstrakt sinflar bir guruh bog'liq sinflar uchun umumiy interfeysni aniqlash usulini taqdim etadi, shu bilan birga har bir quyi sinfga o'zining maxsus implementatsiyasini taqdim etish imkonini beradi. Ular ko'pincha ba'zi standart xatti-harakatlarni ta'minlaydigan va quyi sinflarni ma'lum muhim metodlarni amalga oshirishga majbur qiladigan asosiy sinfni aniqlash uchun ishlatiladi.

Misol (Java):


abstract class Shape {
    protected String color;

    public Shape(String color) {
        this.color = color;
    }

    public abstract double getArea();

    public String getColor() {
        return color;
    }
}

class Circle extends Shape {
    private double radius;

    public Circle(String color, double radius) {
        super(color);
        this.radius = radius;
    }

    @Override
    public double getArea() {
        return Math.PI * radius * radius;
    }
}

class Rectangle extends Shape {
    private double width;
    private double height;

    public Rectangle(String color, double width, double height) {
        super(color);
        this.width = width;
        this.height = height;
    }

    @Override
    public double getArea() {
        return width * height;
    }
}

public class Main {
    public static void main(String[] args) {
        Shape circle = new Circle("Red", 5.0);
        Shape rectangle = new Rectangle("Blue", 4.0, 6.0);

        System.out.println("Aylana yuzasi: " + circle.getArea());
        System.out.println("To'rtburchak yuzasi: " + rectangle.getArea());
    }
}

Ushbu misolda, Shape abstrakt metod getArea() ga ega abstrakt sinfdir. Circle va Rectangle sinflari Shape ni kengaytiradi va getArea() uchun konkret implementatsiyalarni taqdim etadi. Shape sinfidan nusxa olib bo'lmaydi, lekin biz uning quyi sinflaridan nusxalar yaratishimiz va ularni polimorfizmdan foydalanib Shape obyektlari sifatida ishlatishimiz mumkin.

Polimorfizm uchun abstrakt sinflardan foydalanishning afzalliklari:

Polimorfizmning hayotiy misollari

Polimorfizm turli dasturiy ta'minotni ishlab chiqish stsenariylarida keng qo'llaniladi. Mana bir nechta hayotiy misollar:

Polimorfizmning afzalliklari

Kodingizda polimorfizmni qo'llash bir nechta muhim afzalliklarni taqdim etadi:

Polimorfizmning qiyinchiliklari

Polimorfizm ko'plab afzalliklarni taqdim etsa-da, u ba'zi qiyinchiliklarni ham keltirib chiqaradi:

Polimorfizmdan foydalanish bo'yicha eng yaxshi amaliyotlar

Polimorfizmdan samarali foydalanish va uning qiyinchiliklarini yumshatish uchun quyidagi eng yaxshi amaliyotlarni ko'rib chiqing:

Xulosa

Polimorfizm obyektga yo'naltirilgan dasturlash uchun zarur bo'lgan kuchli va ko'p qirrali tushunchadir. Polimorfizmning har xil turlarini, uning afzalliklari va qiyinchiliklarini tushunib, siz undan yanada moslashuvchan, qayta ishlatiladigan va qo'llab-quvvatlanadigan kod yaratish uchun samarali foydalanishingiz mumkin. Veb-ilovalar, mobil ilovalar yoki korporativ dasturiy ta'minotni ishlab chiqarasizmi, polimorfizm yaxshiroq dasturiy ta'minot yaratishga yordam beradigan qimmatli vositadir.

Eng yaxshi amaliyotlarni qo'llash va potentsial qiyinchiliklarni hisobga olish orqali dasturchilar global texnologiya landshaftining doimiy o'zgaruvchan talablariga javob beradigan yanada mustahkam, kengaytiriladigan va qo'llab-quvvatlanadigan dasturiy yechimlarni yaratish uchun polimorfizmning to'liq salohiyatidan foydalanishlari mumkin.

Polimorfizmni Tushunish: Global Dasturchilar uchun To'liq Qo'llanma | MLOG