Menu
Coddy logo textTech

Örtük Arayüzler

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

Her Dart sınıfı otomatik olarak bir arayüz tanımladığından, herhangi bir sınıfı bir arayüz olarak kullanabilirsiniz; tam uygulamalara sahip somut sınıfları bile. Buna örtük arayüz diyoruz.

Özellikleri ve metotları olan bir sınıfı düşünün:

class Logger {
  String prefix = '[LOG]';
  
  void log(String message) {
    print('$prefix $message');
  }
  
  void clear() {
    print('Clearing logs...');
  }
}

Başka bir sınıf Logger arayüzünü uyguladığında (implements), prefix özelliği de dahil olmak üzere her şey için kendi uygulamasını sağlamalıdır:

class FileLogger implements Logger {
  @override
  String prefix = '[FILE]';
  
  @override
  void log(String message) {
    print('$prefix Writing to file: $message');
  }
  
  @override
  void clear() {
    print('Deleting log file...');
  }
}

Temel içgörü şudur: implements kullandığınızda, "sınıfım aynı şekle sahip olacak" -yani aynı metotlara ve özelliklere- demiş olursunuz. Herhangi bir kod, yapıcı (constructor) veya varsayılan değer miras almazsınız. Sadece arayüzün (interface) yapısına uymayı taahhüt edersiniz.

Bu, örtük arayüzleri (implicit interfaces) değiştirilebilir bileşenler oluşturmak için güçlü kılar. Bir Logger bekleyen kod, bu uygulamanın dahili olarak nasıl çalıştığına bakılmaksızın, onun arayüzünü uygulayan herhangi bir sınıfla çalışabilir.

challenge icon

Görev

Kolay

Somut sınıfların nasıl örtük arayüzler (implicit interfaces) olarak hizmet edebileceğini gösteren bir bildirim sistemi oluşturalım. Temel bir bildirim sınıfı oluşturacak ve ardından bunu tamamen farklı bir şekilde uygulayacaksınız; bu da implements anahtar kelimesinin tüm üyeleri kendinizin sağlamasını gerektirdiğini gösterecektir.

Kodunuzu iki dosyada düzenleyeceksiniz:

  • notification.dart: Bildirim sınıflarınızı burada tanımlayın:
    • 'default' değerine ayarlanmış bir String channel özelliğine, [channel]: [message] yazdıran bir send(String message) metoduna ve 'Notification ready' dizesini döndüren bir getStatus() metoduna sahip bir Notification sınıfı.
    • Notification sınıfını implements eden bir EmailNotification sınıfı. implements kullandığınız için kendi channel özelliğinizi sağlamalısınız (bunu 'email' olarak ayarlayın), Sending email: [message] yazdıran kendi send() metodunuzu ve 'Email service active' döndüren kendi getStatus() metodunuzu yazmalısınız.
    • Notification sınıfını implements eden bir PushNotification sınıfı. channel özelliğini 'push' olarak ayarlayın, send() metodunun Push alert: [message] yazdırmasını sağlayın ve getStatus() metodunun 'Push service connected' döndürmesini sağlayın.
  • main.dart: Bildirim dosyanızı içe aktarın ve farklı sınıfların aynı örtük arayüzü tamamen farklı davranışlarla nasıl uygulayabileceğini gösterin:
    • Bir EmailNotification ve bir PushNotification oluşturun.
    • Her bildirim için getStatus() kullanarak durumunu yazdırın, ardından 'Hello World' mesajıyla send() metodunu çağırın.
    • İki bildirim arasında boş bir satır yazdırın.

Unutmayın: implements kullandığınızda, Notification sınıfından herhangi bir kod miras almazsınız. Sadece sınıfınızın aynı şekle (aynı özelliklere ve metodlara) sahip olacağına dair söz verirsiniz. Her uygulayan sınıf kendi tam uygulamasını sağlar.

Beklenen çıktı:

Email service active
Sending email: Hello World

Push service connected
Push alert: Hello World

Kendin dene

import 'notification.dart';

void main() {
  // TODO: Bir EmailNotification örneği oluşturun
  
  // TODO: getStatus() kullanarak e-posta bildiriminin durumunu yazdırın
  
  // TODO: E-posta bildirimini kullanarak 'Hello World' mesajı gönderin
  
  // TODO: Boş bir satır yazdırın
  
  // TODO: Bir PushNotification örneği oluşturun
  
  // TODO: getStatus() kullanarak push bildiriminin durumunu yazdırın
  
  // TODO: Push bildirimini kullanarak 'Hello World' mesajı gönderin
  
}
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