14. Polymorphism

Oldingi bobda inheritance, ya'ni meros olishni o‘rgandik.

Endi inheritance bilan juda ko‘p ishlatiladigan yana bir muhim tushuncha — polymorphism bilan tanishamiz.

"Polymorphism" so‘zi "ko‘p shakllilik" degan ma'noni anglatadi.

Oddiy qilib aytganda:

Bitta method turli objectlarda turlicha ishlashi mumkin.

Oddiy misol

Tasavvur qiling, bizda Animal classi bor:

class Animal {

    void ovoz() {
        System.out.println("Hayvon ovoz chiqaryapti.");
    }
}

Endi Dog va Cat undan meros oladi.

class Dog extends Animal {

    @Override
    void ovoz() {
        System.out.println("Vov-vov!");
    }
}

class Cat extends Animal {

    @Override
    void ovoz() {
        System.out.println("Miyov!");
    }
}

Endi:

Dog it = new Dog();
Cat mushuk = new Cat();

it.ovoz();
mushuk.ovoz();

Natija:

Vov-vov!
Miyov!

Ikkalasida ham method nomi bir xil:

ovoz()

Lekin natija har xil.

Bu polymorphismning oddiy ko‘rinishi.

Parent type bilan ishlash

Polymorphismning muhim tomoni — child objectni parent type orqali saqlash mumkin.

Masalan:

Animal it = new Dog();
Animal mushuk = new Cat();

Bu yerda:

Animal

type hisoblanadi.

Lekin objectlar:

Dog
Cat

hisoblanadi.

Keyin:

it.ovoz();
mushuk.ovoz();

Natija:

Vov-vov!
Miyov!

Java objectning haqiqiy turiga qarab kerakli methodni ishlatadi.

Nima uchun bu foydali?

Tasavvur qiling, bizda ko‘p hayvonlar bor:

Dog
Cat
Horse

Ularning hammasida:

ovoz()

methodi mavjud.

Biz ularning hammasini Animal sifatida ishlatishimiz mumkin.

Masalan:

Animal[] hayvonlar = {
    new Dog(),
    new Cat(),
    new Horse()
};

Keyin:

for (Animal hayvon : hayvonlar) {
    hayvon.ovoz();
}

Har bir hayvon o‘zining ovoz() methodini ishlatadi.

To‘liq misol

class Animal {

    void ovoz() {
        System.out.println("Hayvon ovoz chiqaryapti.");
    }
}

class Dog extends Animal {

    @Override
    void ovoz() {
        System.out.println("Vov-vov!");
    }
}

class Cat extends Animal {

    @Override
    void ovoz() {
        System.out.println("Miyov!");
    }
}

public class Main {

    public static void main(String[] args) {

        Animal it = new Dog();
        Animal mushuk = new Cat();

        it.ovoz();
        mushuk.ovoz();
    }
}

Natija:

Vov-vov!
Miyov!

Polymorphism va array

Polymorphism arraylar bilan juda qulay ishlaydi.

Masalan:

Animal[] hayvonlar = {
    new Dog(),
    new Cat()
};

Keyin:

for (Animal hayvon : hayvonlar) {
    hayvon.ovoz();
}

Natija:

Vov-vov!
Miyov!

Bu yerda bitta array ichida turli objectlar bor.

Ularning umumiy tomoni — Animaldan meros olgan.

Method overriding

Polymorphism ko‘pincha method overriding bilan birga ishlatiladi.

Masalan:

class Animal {

    void ovoz() {
        System.out.println("Hayvon ovoz chiqaryapti.");
    }
}

class Dog extends Animal {

    @Override
    void ovoz() {
        System.out.println("Vov-vov!");
    }
}

Dog parent classdagi ovoz() methodini o‘ziga moslab o‘zgartirdi.

Yana bir misol

Transport vositalarini olaylik.

class Vehicle {

    void yur() {
        System.out.println("Transport yurmoqda.");
    }
}

class Car extends Vehicle {

    @Override
    void yur() {
        System.out.println("Mashina yo‘lda yurmoqda.");
    }
}

class Bicycle extends Vehicle {

    @Override
    void yur() {
        System.out.println("Velosiped yurmoqda.");
    }
}

Endi:

Vehicle[] transportlar = {
    new Car(),
    new Bicycle()
};

for (Vehicle transport : transportlar) {
    transport.yur();
}

Natija:

Mashina yo‘lda yurmoqda.
Velosiped yurmoqda.

Polymorphismning yana bir turi

Java'da polymorphismning yana bir ko‘rinishi — method overloading.

Masalan:

class Calculator {

    int qosh(int a, int b) {
        return a + b;
    }

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

Bu yerda method nomi bir xil:

qosh()

Lekin parametrlar soni har xil.

Shuning uchun:

Calculator calc = new Calculator();

System.out.println(calc.qosh(10, 20));

System.out.println(calc.qosh(10, 20, 30));

Natija:

30
60

Bu method overloading deyiladi.

Overloading va overriding farqi

Ularni adashtirmang.

Overloading

Bir class ichida bir xil nomli methodlar, lekin parametrlar har xil.

qosh(int a, int b)

qosh(int a, int b, int c)

Overriding

Child class parent classdagi methodni qayta yozadi.

class Dog extends Animal {

    @Override
    void ovoz() {
        System.out.println("Vov-vov!");
    }
}

Oddiy tasavvur

Polymorphismni quyidagicha tasavvur qilish mumkin:

Animal
  |
  +---- Dog  → Vov-vov!
  |
  +---- Cat  → Miyov!
  |
  +---- Horse → I-hah!

Hammasida:

ovoz()

bor.

Lekin har biri o‘ziga mos natija beradi.

Qachon polymorphism kerak?

Polymorphism katta dasturlarda juda foydali.

Masalan, dasturda:

Dog
Cat
Horse
Bird

kabi ko‘plab classlar bo‘lsa, ularni umumiy Animal type orqali boshqarish mumkin.

Bu kodni yanada tartibli va moslashuvchan qiladi.

Amaliy mashqlar

1-mashq

Animal classini yarating.

Unda:

ovoz()

methodi bo‘lsin.

Keyin:

Dog
Cat

classlarini yarating.

Har biri ovoz() methodini o‘ziga moslab yozsin.

2-mashq

Vehicle classini yarating.

Unda:

yur()

methodi bo‘lsin.

Keyin:

Car
Bicycle

classlarini yarating.

Har biri yur() methodini o‘zgartirsin.

3-mashq

Animal[] array yarating.

Ichiga:

Dog
Cat
Dog

objectlarini joylashtiring.

Loop yordamida barcha hayvonlarning ovozini chiqaring.

4-mashq

Calculator classida qosh() methodini overloading qiling.

Quyidagilarni yarating:

qosh(int a, int b)

va:

qosh(int a, int b, int c)

Muhim narsalarni eslab qoling

Polymorphism — bitta method turli objectlarda turlicha ishlashi.

Masalan:

Animal it = new Dog();
Animal mushuk = new Cat();

it.ovoz();
mushuk.ovoz();

Natija:

Vov-vov!
Miyov!

Overriding — child class parent methodini qayta yozadi.

Overloading — bir xil nomli methodlar turli parametrlar bilan ishlaydi.

Polymorphism Java'da katta va murakkab dasturlarni tartibli yozishda juda muhim tushunchadir.