Dart Dilinde Interface Kavramı (implements)
Aslında Dart’ta diğer programlama dillerinde olduğu gibi interface (arayüz) diye bir kavram yok. Ancak Dart dilinde interface kavramı yerine implements anahtar kelimesi kullanarak ilgili sınıfları birer interface sınıfa dönüştürebiliyoruz.
Dart Dilinde Interface Kavramı
Malumunuz Dart dilinde her sınıf ancak tek bir sınıftan türetilebilir (miras alabilir). Bu yüzden bir sınıf, birden fazla sınıftan miras alamamaktadır. İşte ınterface ile bu durum tabiri caizse aşılmaktadır.
Dart dilinde interface kavramı yoktur dedik fakat bir sınıf, birden fazla sınıfı implements anahtar kelimesi ile miras alabilir ve bu sayede çoklu kalıtım sağlanabilir.
Ayrıca belirtmek gerekir ki bir sınıf birden fazla sınıftan implemente edilebilirken buna karşılık sadece tek bir sınıftan extends edilebilir.
Böylece ortak özelliği olan ancak kalıtımsal olarak alakalı olmayan sınıfları bir çatı altında toplayabiliriz. Ancak belirtmek gerekir ki interface olarak kullanılan sınıfların metotları bu sınıfları implemente eden sınıflar tarafından yazılmak zorundadır. Bu yönüyle soyut sınıflarla (abstract classes) benzerlik göstermektedir. Fakat soyut sınıflardan farklı olarak implements edilen sınıfların sadece soyut metotları değil somut metotları da yazılmak zorundadır.
Tekrarlamakta fayda var. Her ne kadar Dart çoklu kalıtımı desteklemese de, bir sınıf çoklu kalıtım elde etmek için implements’i bir mekanizma olarak kullanılabilir.
Aşağıdaki örnek kodlama umuyoruz ki anlaşılır olmuştur:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
main() { var penguenJohn = Penguen (); penguenJohn.etYiyebilir(); penguenJohn.kosabilir(); penguenJohn.yuzebilir(); Aslan aslanSimbad = Aslan (); //var olarak da oluşturabiliriz. aslanSimbad.etYiyebilir(); aslanSimbad.kosabilir(); Leylek leylekAnka = Leylek (); leylekAnka.etYiyebilir(); leylekAnka.ucabilir(); leylekAnka.soyutOlmayanMetot(); } class Hayvan { void soyutOlmayanMetot (){ print ("Gövdesi olan metotlar somut metotlardır."); print ("Hayvan sınıfı sadece Leylek sınıfının üst sınıfıdır."); } } abstract class Ucabilenler { void ucabilir (); //gövdesi olmayan soyut metotlar (sadece soyut sınıflrda olur) } abstract class Yuzebilenler { void yuzebilir (); //gövdesi olmayan soyut metotlar (sadece soyut sınıflrda olur) } abstract class Kosabilenler { void kosabilir (); //gövdesi olmayan soyut metotlar (sadece soyut sınıflrda olur) } abstract class Etciller { void etYiyebilir (); //gövdesi olmayan soyut metotlar (sadece soyut sınıflrda olur) } abstract class Otcullar { void otYiyebilir (); //gövdesi olmayan soyut metotlar (sadece soyut sınıflrda olur) } class Aslan implements Kosabilenler, Etciller { @override void kosabilir (){ print ("Aslan koşabilen bir canlıdır."); } @override void etYiyebilir (){ print ("Aslan etçil bir canlıdır."); } } class Leylek extends Hayvan implements Ucabilenler, Etciller { //extend dediğimiz için yazmamıza gerek hayvan sınıfını tekrardan yazmamıza yok //implements yaptığımız sınıfta olanları tekrardan yazmalıyız. @override void ucabilir (){ print ("Leylek uçabilen bir canlıdır."); } @override void etYiyebilir (){ print ("Leylek etçil bir canlıdır."); } } class Penguen implements Yuzebilenler, Etciller, Kosabilenler { @override void yuzebilir (){ print ("Penguen yüzebilen bir canlıdır."); } @override void etYiyebilir (){ print ("Penguen etçil bir canlıdır."); } @override void kosabilir (){ print ("Penguen koşabilir."); } } |
Çıktı:
Penguen etçil bir canlıdır.
Penguen koşabilir.
Penguen yüzebilen bir canlıdır.
Aslan etçil bir canlıdır.
Aslan koşabilen bir canlıdır.
Leylek etçil bir canlıdır.
Leylek uçabilen bir canlıdır.
Gövdesi olan metotlar somut metotlardır.
Hayvan sınıfı sadece Leylek sınıfının üst sınıfıdır.
Kodu çalıştırmak için: DartPad