Metot Ezme
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 38 / 110.
Metot geçersiz kılma (Method overriding), bir alt sınıfın, üst sınıfta zaten mevcut olan bir metodun kendi uygulamasını sunmasıyla gerçekleşir. Bu, alt sınıfların aynı metot imzasını korurken devralınan davranışı özelleştirmesine olanak tanır.
Bir alt sınıfta, üst sınıftakiyle aynı isim ve parametrelere sahip bir metot tanımladığınızda, alt sınıfın sürümü öncelik kazanır:
class Animal {
String name;
Animal(this.name);
void speak() {
print('$name makes a sound');
}
}
class Dog extends Animal {
Dog(String name) : super(name);
void speak() {
print('$name barks: Woof!');
}
}
void main() {
var animal = Animal('Generic');
var dog = Dog('Buddy');
animal.speak(); // Generic bir ses çıkarır
dog.speak(); // Buddy havlar: Woof!
}Bir Dog örneği üzerinde speak() metodunu çağırdığınızda, Dart Animal'ınkini değil, Dog'un versiyonunu yürütür. Alt sınıf, üst sınıfın metodunu geçersiz kılmıştır (overridden).
Ebeveynin davranışını değiştirmek yerine genişletmek için geçersiz kılmayı (overriding) super ile de birleştirebilirsiniz:
class Cat extends Animal {
Cat(String name) : super(name);
void speak() {
super.speak(); // Önce ebeveynin versiyonunu çağır
print('$name also purrs');
}
}Bu desen, mevcut işlevsellik üzerine inşa etmenize olanak tanır. Temel kural basittir: alt sınıftaki aynı metot adı ve parametreler, alt sınıf örnekleri üzerinde çağrıldığında üst sınıfın uygulamasının yerini alır.
Görev
KolayAlt sınıfların davranışı özelleştirmek için üst sınıf metotlarını nasıl geçersiz kılabileceğini (override) gösteren bir bildirim sistemi oluşturalım. Her biri mesajları kendine özgü bir şekilde ileten farklı bildirim türleri oluşturacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
notification.dart: Bildirim hiyerarşinizi burada tanımlayın:String titleveString messageözelliklerine sahip birNotificationsınıfı (üst sınıf). Her iki değeri de alan bir yapıcı (constructor) veNotification: [title] - [message]çıktısını veren birsend()metodu ekleyin.Notificationsınıfını genişleten ve birString recipientözelliği ekleyen birEmailNotificationsınıfı.send()metodunu,Sending email to [recipient]: [title] - [message]çıktısını verecek şekilde geçersiz kılın.Notificationsınıfını genişleten ve birString deviceIdözelliği ekleyen birPushNotificationsınıfı.send()metodunu, öncesuperkullanarak üst sınıfınsend()metodunu çağıracak, ardından bir sonraki satıraPushed to device: [deviceId]yazdıracak şekilde geçersiz kılın.
main.dart: Bildirim dosyanızı içe aktarın ve metot geçersiz kılma işlemini uygulamalı olarak gösterin:- Başlığı
'Alert've mesajı'System update available'olan temel birNotificationoluşturun. send()metodunu çağırın.- Boş bir satır yazdırın.
- Başlığı
'Welcome', mesajı'Thanks for signing up!'ve alıcısı'user@example.com'olan birEmailNotificationoluşturun. send()metodunu çağırın.- Boş bir satır yazdırın.
- Başlığı
'Reminder', mesajı'Meeting in 10 minutes've deviceId'si'DEVICE-001'olan birPushNotificationoluşturun. send()metodunu çağırın.
- Başlığı
EmailNotification sınıfının üst sınıfın davranışını tamamen nasıl değiştirdiğine, PushNotification sınıfının ise önce super.send() çağrısı yaparak bu davranışı nasıl genişlettiğine dikkat edin. Her iki yaklaşım da ihtiyaçlarınıza bağlı olarak metotları geçersiz kılmanın geçerli yollarıdır.
Beklenen çıktı:
Notification: Alert - System update available
Sending email to user@example.com: Welcome - Thanks for signing up!
Notification: Reminder - Meeting in 10 minutes
Pushed to device: DEVICE-001Kopya kağıdı
Metot geçersiz kılma (method overriding), bir alt sınıfın, üst sınıfta zaten mevcut olan bir metodun kendi uygulamasını sunmasıyla gerçekleşir. Alt sınıfın sürümü, alt sınıf örnekleri üzerinden çağrıldığında üst sınıfınkinin yerini alır.
Bir metodu geçersiz kılmak için, onu alt sınıfta aynı isim ve parametrelerle tanımlayın:
class Animal {
String name;
Animal(this.name);
void speak() {
print('$name makes a sound');
}
}
class Dog extends Animal {
Dog(String name) : super(name);
void speak() {
print('$name barks: Woof!');
}
}
void main() {
var animal = Animal('Generic');
var dog = Dog('Buddy');
animal.speak(); // Generic makes a sound
dog.speak(); // Buddy barks: Woof!
}Davranışı tamamen değiştirmek yerine genişletmek amacıyla üst sınıfın sürümünü çağırmak için super kullanabilirsiniz:
class Cat extends Animal {
Cat(String name) : super(name);
void speak() {
super.speak(); // Önce üst sınıfın sürümünü çağır
print('$name also purrs');
}
}Kendin dene
import 'notification.dart';
void main() {
// TODO: 'Alert' başlıklı ve 'System update available' mesajlı bir temel Notification oluşturun
// Bunun send() metodunu çağırın
// TODO: Boş bir satır yazdırın
// TODO: Şunlara sahip bir EmailNotification oluşturun:
// - title: 'Welcome'
// - message: 'Thanks for signing up!'
// - recipient: 'user@example.com'
// Bunun send() metodunu çağırın
// TODO: Boş bir satır yazdırın
// TODO: Şunlara sahip bir PushNotification oluşturun:
// - title: 'Reminder'
// - message: 'Meeting in 10 minutes'
// - deviceId: 'DEVICE-001'
// Bunun send() metodunu ç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ı