10.1 Polimorfizmin əsasları
Polimorfizm obyekt yönümlü proqramlaşdırmanın (OYP) əsas konsepsiyalarından biridir. Ümumi mənada, polimorfizm müxtəlif siniflərin obyektlərinə eyni interfeysdən istifadə edərək məlumatları emal etməyə imkan verir. JavaScript kontekstində bu o deməkdir ki, müxtəlif obyektlər eyni adda metodlara sahib ola bilər və həmin metodlar obyektlərin konkret tipi bilinmədən çağırılabilir.
Polimorfizm tipləri
JavaScript-də əsas polimorfizm tipləri bunlardır:
1. Ad-hoc polimorfizm (ad-hoc polymorphism):
- Metodların polimorfizmi, müxtəlif tiplərdən olan obyektlər üçün eyni adla metodların çağırılması
- Misallara funksiya və operatorların overload-u daxildir (JavaScript-də birbaşa dəstəklənmir, amma simulyasiya oluna bilər)
2. Subtip polimorfizmi (Subtype polymorphism):
- Subtip və ya daxiletmə polimorfizmi, eyni baz sinifdən irs alınmış müxtəlif siniflərin obyektləri baz sinif obyektləri kimi işlənə bilər
- Bu, əsas polimorfizm növüdür və irs alma və interfeyslər vasitəsilə həyata keçirilir
Polimorfizmin üstünlükləri:
- Kodun sadələşdirilməsi: polimorfizm daha çevik və ümumi kod yazmağa imkan verir, hansı ki, müxtəlif obyekt tipləri ilə işləyə bilər və onların konkret tiplərini bilməyə ehtiyac duymaz.
- Genişləndirmə: polimorfizm sistemə yeni tiplər və davranışlar əlavə etməyi asanlaşdırır, mövcud kodu dəyişməyə ehtiyac qalmır.
- Dəstək: polimorfizm daha yaxşı vəzifə bölgüsünü təmin edir və kodu daha oxunaqlı və dəstək göstərilməsi asan edir.
10.2 Polimorfizm nümunələri JavaScript-də
İrsi əlaqə vasitəsilə alt növlərin polimorfizmi
Nümunə 1: Müxtəlif obyekt növlərinin bir interfeys vasitəsilə işlənməsi
Bu nümunədə playWithAnimal
funksiyası Animal
tipində obyekt qəbul edir və makeSound
metodunu çağırır. Dog
və Cat
obyektləri, hansı ki Animal
-dan irs alır, makeSound
metodunu özlərinə uyğun şəkildə təyin edir və hər obyektin metodu çağırıldıqda fərqli nəticə alınır.
class Animal {
makeSound() {
console.log('Hansısa ümumi səs');
}
}
class Dog extends Animal {
makeSound() {
console.log('Hav-hav!');
}
}
class Cat extends Animal {
makeSound() {
console.log('Miyov!');
}
}
function playWithAnimal(animal) {
animal.makeSound();
}
const dog = new Dog();
const cat = new Cat();
playWithAnimal(dog); // Çap edir: Hav-hav!
playWithAnimal(cat); // Çap edir: Miyov!
10.3 Polimorfizm interfeyslər vasitəsilə (Duck Typing)
JavaScript-də TypeScript və ya Java kimi digər proqramlaşdırma dillərində olduğu kimi interfeyslər üçün daxili dəstək yoxdur. Bunun əvəzinə "ördəkləmə" (Duck Typing) adı verilən yanaşma istifadə olunur. Bu o deməkdir ki, obyekt müvafiq interfeysə uyğun hesab edilir, əgər onda tələb olunan metodlar və xüsusiyyətlər varsa, onun konkret tipi və ya irsiyyəti nəzərə alınmadan.
Ördək qaydası (duck): əgər nəsə ördək kimi görünürsə, ördək kimi üzürsə və ördək kimi quak edirsə, bu, çox güman ki, ördəkdir.
Misal 2: Ördək yanaşmasının istifadəsi
Bu nümunədə takeOff
funksiyası, istənilən sinfi qəbul edir əlbəttəində sinfi vərsiye####
10.4 Funksiyalar vasitəsilə polimorfizm
JavaScript-də funksiyalar birinci sinif obyektlərdir və onları ötürmək və polimorf davranışı reallaşdırmaq üçün istifadə etmək mümkündür.
Nümunə 3: Funksiyalar vasitəsilə polimorfizm
Bu nümunədə greet
funksiyası başqa bir funksiyanı arqument kimi qəbul edir və onu çağırır. Bu, müxtəlif funksiyalardan fərqli hərəkətlərin həyata keçirilməsi üçün istifadə etməyə imkan verir.
function greetMorning() {
console.log('Sabahınız xeyir!');
}
function greetEvening() {
console.log('Axşamınız xeyir!');
}
function greet(greetingFunction) {
greetingFunction();
}
greet(greetMorning); // Çıxaracaq: Sabahınız xeyir!
greet(greetEvening); // Çıxaracaq: Axşamınız xeyir!
10.5 Metodun yükləməsini polimorfizm ilə simulyasiya etmək
JavaScript digər proqramlaşdırma dilləri kimi birbaşa metodların yükləməsini dəstəkləmir. Amma metodların yüklənməsini funksiyaların arqumentlərindən və onların növlərinin yoxlanmasından istifadə edərək simulyasiya etmək olar.
Nümunə 4: Metodların yüklənməsinin simulyasiyası
Bu nümunədə add
metodu iki arqument qəbul edir və onların növlərinə uyğun müxtəlif əməliyyatlar yerinə yetirir. Əgər arqumentlər rəqəmdirsə, metod onları toplar. Əgər arqumentlər massivdirsə, metod onları birləşdirir.
class Calculator {
add(a, b) {
if (typeof a === 'number' && typeof b === 'number') {
return a + b;
} else if (Array.isArray(a) && Array.isArray(b)) {
return a.concat(b);
} else {
throw new Error('Yanlış arqumentlər');
}
}
}
const calc = new Calculator();
console.log(calc.add(1, 2)); // Çap edəcək: 3
console.log(calc.add([1, 2], [3, 4])); // Çap edəcək: [1, 2, 3, 4]
GO TO FULL VERSION