Menu
Coddy logo textTech

Interface'ler ile Çok Biçimlilik

Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 58 / 110.

Önceki derste, kalıtım yoluyla polimorfizmi —alt nesnelerle çalışmak için bir üst sınıf türü kullanmayı— gördünüz. Ancak polimorfizm arayüzler (interfaces) aracılığıyla da çalışır ve bu yaklaşım genellikle daha esnektir.

Sınıflar aynı arayüzü uyguladığında, aralarında bir kalıtım ilişkisi olmasa bile onlara polimorfik olarak davranabilirsiniz:

abstract class Printable {
  void printDetails();
}

class Invoice implements Printable {
  @override
  void printDetails() => print('Invoice #1234');
}

class Report implements Printable {
  @override
  void printDetails() => print('Monthly Report');
}

class Receipt implements Printable {
  @override
  void printDetails() => print('Receipt for purchase');
}

void printAll(List<Printable> items) {
  for (var item in items) {
    item.printDetails();
  }
}

void main() {
  var documents = [Invoice(), Report(), Receipt()];
  printAll(documents);
}

Invoice, Report ve Receipt tamamen alakasız sınıflardır; ortak bir üst sınıfa sahip değillerdir. Yine de hepsi Printable arayüzünü uyguladıkları için, onları aynı listede saklayabilir ve her biri üzerinde printDetails() metodunu çağırabiliriz.

Bu güçlüdür çünkü bir kalıtım hiyerarşisi zorlamadan davranış sözleşmeleri tanımlamanıza olanak tanır. Herhangi bir sınıf, neyi genişlettiğine bakılmaksızın bir arayüzü (interface) uygulayabilir. Mevcut kodu değiştirmeden yeni yazdırılabilir türler ekleyebildiğiniz için kodunuz daha modüler hale gelir; sadece arayüzü uygulamanız yeterlidir.

challenge icon

Görev

Kolay

Arayüzler aracılığıyla polimorfizmi (çok biçimlilik) gösteren bir medya oynatıcı sistemi oluşturalım. "Oynatılabilir" olmanın ne anlama geldiğini tanımlayan bir arayüz oluşturacak, ardından aralarında kalıtım ilişkisi olmamasına rağmen bu sözleşmeyi yerine getiren ve tek tip olarak işlenmelerine olanak tanıyan birkaç bağımsız medya türü uygulayacaksınız.

Kodunuzu iki dosyada organize edeceksiniz:

  • media.dart: Arayüzünüzü ve medya sınıflarınızı burada tanımlayın:
    • İki soyut metodu olan bir soyut sınıf Playable: play() ve String getMediaType()
    • Playable arayüzünü uygulayan bir Song sınıfı. String title ve String artist özelliklerine sahip olmalıdır. play() metodu Playing song: [title] by [artist] yazdırır ve getMediaType() metodu 'Audio' değerini döndürür.
    • Playable arayüzünü uygulayan bir Video sınıfı. String title ve int duration (dakika cinsinden) özelliklerine sahip olmalıdır. play() metodu Playing video: [title] ([duration] min) yazdırır ve getMediaType() metodu 'Video' değerini döndürür.
    • Playable arayüzünü uygulayan bir Podcast sınıfı. String title ve int episode özelliklerine sahip olmalıdır. play() metodu Playing podcast: [title] - Episode [episode] yazdırır ve getMediaType() metodu 'Podcast' değerini döndürür.
    Ayrıca, liste üzerinde dönen ve her öğe için [Media Type]: yazdırdıktan sonra o öğe üzerinde play() metodunu çağıran bir playAll(List<Playable> playlist) fonksiyonu oluşturun.
  • main.dart: Medya dosyanızı içe aktarın ve arayüz tabanlı polimorfizmi gösterin:
    • Başlığı 'Imagine' ve sanatçısı 'John Lennon' olan bir Song, başlığı 'Dart Tutorial' ve süresi 15 olan bir Video ve başlığı 'Tech Talk' ve bölümü 42 olan bir Podcast içeren bir List<Playable> oluşturun.
    • Bu listeyi playAll() fonksiyonuna gönderin.

Song, Video ve Podcast sınıflarının ortak bir üst sınıfa sahip olmadığına dikkat edin; bunlar tamamen alakasız türlerdir. Ancak hepsi Playable arayüzünü uyguladığı için, onları aynı listede saklayabilir ve arayüz aracılığıyla onlara tek tip olarak davranabilirsiniz.

Beklenen çıktı:

Audio:
Playing song: Imagine by John Lennon
Video:
Playing video: Dart Tutorial (15 min)
Podcast:
Playing podcast: Tech Talk - Episode 42

Kopya kağıdı

Polimorfizm, arayüzler aracılığıyla çalışır ve kalıtım ilişkisi olmayan alakasız sınıfların tek tip olarak ele alınmasına olanak tanır.

Aynı arayüzü uygulayan sınıflar polimorfik olarak kullanılabilir:

abstract class Printable {
  void printDetails();
}

class Invoice implements Printable {
  @override
  void printDetails() => print('Invoice #1234');
}

class Report implements Printable {
  @override
  void printDetails() => print('Monthly Report');
}

void printAll(List<Printable> items) {
  for (var item in items) {
    item.printDetails();
  }
}

void main() {
  var documents = [Invoice(), Report()];
  printAll(documents);
}

Arayüz tabanlı polimorfizm şunları yapmanıza olanak tanır:

  • Kalıtım hiyerarşilerini zorlamadan davranış sözleşmeleri tanımlama
  • Alakasız türleri aynı koleksiyonda saklama
  • Mevcut kodu değiştirmeden yeni türler ekleme
  • Kodu daha modüler ve esnek hale getirme

Kendin dene

import 'media.dart';

void main() {
  // YAPILACAK: Şunları içeren bir List<Playable> oluşturun:
  // - Başlığı 'Imagine' ve sanatçısı 'John Lennon' olan bir Song
  // - Başlığı 'Dart Tutorial' ve süresi 15 olan bir Video
  // - Başlığı 'Tech Talk' ve bölümü 42 olan bir Podcast
  
  // YAPILACAK: Listeyi playAll() fonksiyonuna geçirin
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler