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 -çocuk nesnelerle çalışmak için bir ebeveyn 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 ilişkisiz sınıflardır - ortak bir üst sınıfa sahip değillerdir. Yine de hepsi Printable arayüzünü uyguladığı için, onları aynı listede saklayabilir ve her biri üzerinde printDetails() metodunu çağırabiliriz.

Bu güçlüdür çünkü bir inheritance hiyerarşisini zorlamadan davranış sözleşmeleri tanımlamanıza olanak tanır. Herhangi bir class, neyi extends ettiğine bakılmaksızın bir interface uygulayabilir. Kodunuz daha modüler hale gelir çünkü mevcut kodu değiştirmeden yeni yazdırılabilir türler ekleyebilirsiniz - sadece interface'i implement etmeniz yeterlidir.

challenge icon

Görev

Kolay

Arayüzler (interfaces) aracılığıyla polimorfizmi (çok biçimlilik) gösteren bir medya oynatıcı sistemi oluşturalım. Bir öğenin "oynatılabilir" olmasını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 bir elden yönetilebilen birkaç farklı medya türü uygulayacaksınız.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • media.dart: Arayüzünüzü ve medya sınıflarınızı burada tanımlayın:
    • İki soyut metoda sahip bir Playable soyut sınıfı: play() ve String getMediaType()
    • Playable arayüzünü uygulayan bir Song sınıfı. Bu 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ı. Bu 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ı. Bu 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 öğenin 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 farklı türlerdir. Ancak hepsi Playable arayüzünü uyguladığı için, onları aynı listede saklayabilir ve arayüz aracılığıyla hepsine aynı şekilde davranabilirsiniz.

Beklenen çıktı:

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

Kendin dene

import 'media.dart';

void main() {
  // TODO: Ş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
  
  // TODO: 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