Ö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 sınıfını uyguladığında, 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...');
}
}İşte temel içgörü: implements kullandığınızda, “sınıfım aynı şekle sahip olacak” diyorsunuz; yani aynı metotlara ve özelliklere sahip olacak. Herhangi bir kodu, kurucuyu veya varsayılan değeri miras almazsınız. Yalnızca arayüzün yapısıyla eşleşeceğinize söz veriyorsunuz.
Bu, örtük arayüzleri birbiriyle 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ığından bağımsız olarak, arayüzünü uygulayan herhangi bir sınıfla çalışabilir.
Görev
KolaySomut sınıfların örtük arayüzler olarak nasıl kullanılabileceğini gösteren bir bildirim sistemi oluşturalım. Bir temel bildirim sınıfı oluşturacak ve ardından bunu tamamen farklı bir şekilde uygulayarak implements kullanımının tüm üyeleri kendiniz sağlamanızı gerektirdiğini göstereceksiniz.
Kodunuzu iki dosyada düzenleyeceksiniz:
notification.dart: Bildirim sınıflarınızı burada tanımlayın:Notificationolarak ayarlanmış birString channelözelliğine,'default'yazdıran birsend(String message)metoduna ve[channel]: [message]dizesini döndüren birgetStatus()metoduna sahip bir'Notification ready'sınıfıEmailNotificationsınıfını implements eden birNotificationsınıfı.implementskullandığınız için kendichannelözelliğinizi sağlamalısınız ('email'olarak ayarlayın),send()yazdıran kendiSending email: [message]metodunuzu vegetStatus()döndüren kendi'Email service active'metodunuzu oluşturmalısınızPushNotificationsınıfını implements eden birNotificationsınıfı.channeldeğerini'push'olarak ayarlayın,send()metodununPush alert: [message]yazdırmasını sağlayın vegetStatus()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
EmailNotificationve birPushNotificationoluşturun - Her bildirim için
getStatus()kullanarak durumunu yazdırın, ardındansend()mesajıyla'Hello World'metodunu çağırın - İki bildirim arasına boş bir satır yazdırın
- Bir
Unutmayın: implements kullandığınızda Notification sınıfından herhangi bir kod devralmazsınız. Yalnızca sınıfınızın aynı şekle — aynı özelliklere ve metotlara — sahip olacağını taahhüt edersiniz. Uygulayan her sınıf kendi eksiksiz uygulamasını sağlar.
Beklenen çıktı:
Email service active
Sending email: Hello World
Push service connected
Push alert: Hello WorldKendin 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
}
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
1Nesne Tabanlı Programlamanın Temelleri
Harici DosyalarKütüphaneler ve İçe AktarmalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar SözcüğüMetotlarÖrnek DeğişkenleriYapıcıların TemelleriTekrar - Basit Hesap Makinesi4Null Güvenliği
Null Güvenliğine GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Sözcüğü ve Null GüvenliğiNull-Aware OperatörlerSınıflarda Null GüvenliğiTekrar - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulamak ve GenişletmekBirden Çok ArayüzTekrar - Şekil Hesaplayıcı10Koleksiyonlar ve Generics
List, Set, Map Genel BakışTür Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorTekrar - Generic Depolama2Dart'ta Yapıcılar
Varsayılan YapıcıAdlandırılmış YapıcılarBaşlatıcı ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Ön Ek KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DerinliğiBilgi GizlemeTekrar - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Çok Mixin KullanımıMixin'lerde on Anahtar SözcüğüMixin ve Kalıtım KarşılaştırmasıMixin ve Arayüz KarşılaştırmasıÖzet - Hayvan Sistemi11Özel Metotlar
toString() Geçersiz KılmahashCode & == Geçersiz KılmaComparable Arayüzücall() MetodunoSuchMethod Geçersiz KılmaÖzet - Özel Koleksiyon14Tasarım Desenleri Bölüm 1
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy Deseni3Sınıf Özellikleri
Örnek ve Static ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatic Metotlar ve AlanlarGetter ve Setter'larÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar SözcüğüMetot Geçersiz Kılma@override Açıklamasıfinal Sınıf Anahtar SözcüğüKurucular ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriArayüzler Yoluyla Çok BiçimlilikÇalışma Zamanı Tür Denetimiis ve as OperatörleriCovariant Anahtar KelimesiTekrar - Ödeme İşlemcisi12Asenkron OOP
Future'ler ve async/awaitStream TemelleriStream DenetleyicileriAsenkron YapıcılarSınıf Metotlarında AsenkronlukÖzet - Veri Getirici15Tasarım Desenleri Bölüm 2
Komut DeseniAdaptör DeseniDekoratör DeseniŞablon Metot DeseniDurum DeseniBileşik DesenDepo DeseniKendi başına pratik yap: Online Dart derleyicisi