Yazımızın içeriğini video olarak ta izleyebilirsiniz.
Polymorphism (Çok Biçimlilik) Nedir?
Farklı nesnelerin miras aldıkları aynı sınıftaki fonksiyonlara farklı tepkiler vermesi, onları kendine uygun şekilde kullanması.
Örnekle açıklamaya çalışalım. Bünyesinde ilk, orta ve liseyi barındıran bir okul olduğunu düşünelim ve bunların her biri için bir sınıf oluşturalım. Bunların ortak özellikleri olan ad, soyad, not ortalaması gibi özelliklerin olduğu üst sınıf olan öğrenci sınıfı olsun. Ancak ilk ve lisenin not ortalaması farklı hesaplanıyor. Bizde kalıtmış olduğumuz öğrenci sınıfını ilk ve lisede kendimize göre uyarlıyalım, yani override edelim. Yani üst sınıf olan öğrenci sınıfının not ortalama fonksiyonunu ezelim ve kendimize uygun hale getirelim.
Polymorphism (Çok Biçimlilik) Örnek Uygulama;
Şimdi bir örnekle bunu açıklamaya çalışalım;
Üç farklı sınıfımız olsun, Üçgen, Kare ve Dikdörtgen. Her bir sınıfta yükseklik ve genişlik değerlerimiz olacaktır. Birde bunların alanını hesaplayan fonksiyonumuz. O zaman her birinde bu özellikler olacağına göre biz bir tane şekil sınıfı tanımlayalım ve değerlerimizi şekil sınıfından miras alalım.
Bu şekilde her şey yolunda gibi ancak alan hesaplama dikdörtgen ve kare için doğru ancak ücgen için doğru değil. İşte bu durumda biz üçgen sınıfı içerisinde alanHesapla() fonksiyonunu override edeceğiz yani şekil sınıfındaki alanHesapla() fonksiyonunu ezik kendimize göre uyarlayacağız. Nasıl mı? Aşağıda önce şekil sınıfını oluşturalım, üçgen, kare ve dikdörtgen sınıflarımızı da oluşturalım ancak üçgen sınıfının içeriğine dikkat edin, o fonksiyonu tekrar oluşturup main içerisinde kullanacağız.
Şekil Sınıfımız;
class Sekil {
double yukseklik;
double genislik;
Sekil(this.yukseklik, this.genislik);
double alanHesapla() {
return yukseklik * genislik;
//Hepsi için alanhesapla fonksiyonu yaptık
//Ancak üçgen için doğru değil
//üçgen sınıfı içerisinde bu fonksiyonu
//override edeceğiz, yani ezip kendimize uygun
//fonksiyon oluşturacağız.
}
}
Kare Sınıfımız;
import 'sekil.dart';
class Kare extends Sekil {
Kare(double yukseklik, double genislik) : super(yukseklik, genislik);
}
Dikdörtgen Sınıfımız;
import 'sekil.dart';
class Dikdorgen extends Sekil {
Dikdorgen(double yukseklik, double genislik) : super(yukseklik, genislik);
}
Üçgen Sınıfımız;
import 'sekil.dart';
class Ucgen extends Sekil {
Ucgen(double yukseklik, double genislik) : super(yukseklik, genislik);
@override //bilgi amaçlı bu yazının bir anlamı yok
double alanHesapla() {
return (yukseklik * genislik) / 2;
//yeni bir alanhesapla fonksiyonu yazdık,
//aynı isimde olduğuna dikkat edin
//şekil sınıfındaki alanhesapla fonksiyonunu ezdik
//kendimize göre uyarladık.
}
}
Şimdi main dosyamızın içerisinde kare, dikdörtgen, üçgen sınıfları oluşturup, alan fonksiyonlarını kullanabiliriz. Aşağıda main dosyamızı inceleyelim;
import 'dikdorgen.dart';
import 'kare.dart';
import 'ucgen.dart';
void main(List<String> args) {
Kare kare = Kare(4, 4);
print(kare.alanHesapla());
Dikdorgen dikdorgen = Dikdorgen(2, 4);
print(dikdorgen.alanHesapla());
Ucgen ucgen = Ucgen(5, 8);
print(ucgen.alanHesapla());
}
/*
SONUÇ
16.0
8.0
20.0
*/
Böylece polymorphism yani çok biçimlilik için bir örnek yapmış olduk. Nesnelerimizi kendi özel durumlarına göre yeniden biçimlendirdik.