@override Anotasyonu
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 39 / 110.
@override anotasyonu, Dart'a (ve diğer geliştiricilere) bir üst sınıftan bir metodu kasıtlı olarak değiştirdiğinizi söyleyen en iyi uygulama işaretçisidir. Metot geçersiz kılma bu olmadan da çalışsa da, @override kullanmak önemli bir güvenlik ağı ekler.
class Animal {
String name;
Animal(this.name);
void speak() {
print('$name makes a sound');
}
}
class Dog extends Animal {
Dog(String name) : super(name);
@override
void speak() {
print('$name barks: Woof!');
}
}Anotasyon iki temel fayda sağlar. İlk olarak, niyetinizi açıkça belgeler; kodu okuyan herkes bu metodun üst sınıfta mevcut olduğunu anında anlar. İkinci olarak, üst metot aslında mevcut değilse Dart'ın çözümleyicisi (analyzer) sizi uyararak yazım hatalarını ve yeniden yapılandırma (refactoring) hatalarını erkenden yakalar.
@override kullanmadan metot adını yanlış yazarsanız ne olacağını bir düşünün:
class Cat extends Animal {
Cat(String name) : super(name);
void speek() { // Yazım hatası! @override olmadan uyarı yok
print('$name meows');
}
}Anotasyon olmadan, Dart speek() adında yeni bir metot oluşturduğunuzu varsayar. @override ile analizör, üst sınıfta böyle bir metodun bulunmadığını hemen işaret eder. Bu basit anotasyon, daha sonra tespit edilmesi zor olabilecek sinsi hataları önler.
Görev
KolayKalıtılan davranışı özelleştirirken @override anotasyonunun önemini gösteren bir medya oynatıcı sistemi oluşturalım. Her biri içeriği kendi yöntemiyle oynatan farklı medya türleri oluşturacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
media.dart: Medya hiyerarşinizi burada tanımlayın:- Bir
String titleözelliğine, başlığı alan bir kurucuya (constructor) vePlaying: [title]yazdıran birplay()metoduna sahip birMediasınıfı Mediasınıfını genişleten ve birString artistözelliği ekleyen birSongsınıfı.@overrideanotasyonunu kullanın vePlaying song: [title] by [artist]yazdırmak içinplay()metodunu geçersiz kılın (override)Mediasınıfını genişleten ve birint duration(saniye cinsinden) özelliği ekleyen birVideosınıfı.@overridekullanın ve öncesuper.play()ile üst sınıfın versiyonunu çağırmak, ardındanDuration: [duration] secondsyazdırmak içinplay()metodunu geçersiz kılın
- Bir
main.dart: Medya dosyanızı içe aktarın ve geçersiz kılınan (overridden) metodları gösterin:- Başlığı
'Generic Content'olan birMedianesnesi oluşturun veplay()metodunu çağırın - Boş bir satır yazdırın
- Başlığı
'Imagine've sanatçısı'John Lennon'olan birSongoluşturun, ardındanplay()metodunu çağırın - Boş bir satır yazdırın
- Başlığı
'Dart Tutorial've süresi360olan birVideooluşturun, ardındanplay()metodunu çağırın
- Başlığı
@override anotasyonu niyetinizi belgeler ve hataları yakalamaya yardımcı olur. Eğer yanlışlıkla play() metodunu plya() olarak yazarsanız, anotasyon sizi üst sınıfta böyle bir metodun bulunmadığı konusunda uyaracaktır.
Beklenen çıktı:
Playing: Generic Content
Playing song: Imagine by John Lennon
Playing: Dart Tutorial
Duration: 360 secondsKopya kağıdı
@override anotasyonu, bir üst sınıf metodunu kasıtlı olarak geçersiz kılan metodları işaretler. İsteğe bağlı olsa da, güvenlik ve netlik sağlar.
class Animal {
String name;
Animal(this.name);
void speak() {
print('$name makes a sound');
}
}
class Dog extends Animal {
Dog(String name) : super(name);
@override
void speak() {
print('$name barks: Woof!');
}
}@override kullanmanın avantajları:
- Niyeti belgeler - metodun üst sınıfta mevcut olduğunu gösterir
- Hataları yakalar - Dart'ın çözümleyicisi (analyzer), üst sınıf metodu mevcut değilse uyararak yazım hatalarını önler
@override olmadan, yazım hataları hata bildirmek yerine yeni metodlar oluşturur:
class Cat extends Animal {
Cat(String name) : super(name);
void speek() { // Yazım hatası uyarı vermeden yeni bir metod oluşturur
print('$name meows');
}
}super kullanarak üst sınıfın versiyonunu çağırabilirsiniz:
@override
void play() {
super.play(); // Önce üst sınıf metodunu çağır
print('Additional behavior');
}Kendin dene
import 'media.dart';
void main() {
// TODO: Başlığı 'Generic Content' olan bir Media nesnesi oluşturun ve play() fonksiyonunu çağırın
// TODO: Boş bir satır yazdırın
// TODO: Başlığı 'Imagine' ve sanatçısı 'John Lennon' olan bir Song nesnesi oluşturun, ardından play() fonksiyonunu çağırın
// TODO: Boş bir satır yazdırın
// TODO: Başlığı 'Dart Tutorial' ve süresi 360 olan bir Video nesnesi oluşturun, ardından play() fonksiyonunu çağırın
}
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
1OOP Temelleri
Harici DosyalarKütüphaneler ve ImportlarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarÖrnek DeğişkenleriConstructor TemelleriÖzet - Basit Hesap Makinesi4Null Safety
Null Safety'ye GirişNullable ve Non-Nullable? ve ! OperatörleriLate Anahtar Kelimesi ve Null SafetyNull-Aware OperatörleriSınıflarda Null SafetyÖzet - Kullanıcı Profili Sistemi7Soyut Sınıflar ve Arayüzler
Soyut SınıflarSoyut MetotlarDart'ta ArayüzlerÖrtük ArayüzlerUygulama vs. GenişletmeÇoklu ArayüzlerÖzet - Şekil Hesaplayıcı10Koleksiyonlar ve Generic'ler
List, Set, Map Genel BakışTip Güvenli KoleksiyonlarGeneric SınıflarGeneric MetotlarGeneric KısıtlamalarIterable ve IteratorÖzet - Generic Depolama2Dart'ta Yapıcılar
Varsayılan Yapıcıİsimlendirilmiş Yapıcılarİlklendirme ListeleriSabit YapıcılarFabrika YapıcılarıYönlendiren YapıcılarÖzet - Şekil Oluşturucu5Kapsülleme
Public ve Private Üyeler_ Öneki KuralıKütüphane Düzeyinde GizlilikGetter ve Setter DetaylarıBilgi GizlemeÖzet - Öğrenci Kayıtları8Mixin'ler
Mixin'lere GirişMixin OluşturmaBirden Fazla Mixin KullanımıMixin'lerde on Anahtar KelimesiMixin vs KalıtımMixin vs ArayüzÖzet - Hayvan Sistemi11Özel Metotlar
toString() OverridehashCode ve == OverrideComparable Arayüzücall() MetodunoSuchMethod OverrideÖzet - Özel Koleksiyon14Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı17Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakter SistemiAraç Kiralama Servisi3Sınıf Özellikleri
Instance ve Statik ÜyelerFinal ve Const AlanlarLate DeğişkenlerStatik Metotlar ve AlanlarGetters ve SettersÖzet - Banka Hesabı Yöneticisi6Kalıtım
Temel Kalıtımsuper Anahtar KelimesiMetot Ezme@override Anotasyonufinal Sınıf Anahtar KelimesiYapıcı Metotlar ve KalıtımÖzet - Çalışan Hiyerarşisi9Çok Biçimlilik
Çok Biçimlilik TemelleriInterface'ler ile Çok BiçimlilikÇalışma Zamanı Tip Kontrolüis ve as OperatörleriCovariant Anahtar KelimesiÖzet - Ödeme İşlemcisi12Asenkron OOP
Futures ve async/awaitStream TemelleriStream Controller'larAsenkron KurucularSınıf Metotlarında Asenkron KullanımıÖzet - Data Fetcher15Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıRepository Kalıbı