Yapıcı Metotlar ve Kalıtım
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 41 / 110.
Bir alt sınıf bir üst sınıfı genişlettiğinde, kalıtılan alanları düzgün bir şekilde başlatmak için üst sınıfın kurucusu çağrılmalıdır. Dart, super kullanarak başlatıcı listesi (initializer list) aracılığıyla bunu yönetmek için esnek yollar sunar.
Eğer ebeveyn sınıfın parametreli bir kurucusu (constructor) varsa, alt sınıf bunu açıkça çağırmalıdır:
class Person {
String name;
int age;
Person(this.name, this.age);
}
class Student extends Person {
String school;
Student(String name, int age, this.school) : super(name, age);
}Dart 2.17, parametreleri doğrudan üst sınıf yapıcısına ileten daha temiz bir söz dizimi olan süper parametreleri (super parameters) tanıttı:
class Student extends Person {
String school;
// super.name ve super.age doğrudan Person'ın kurucusuna iletilir
Student(super.name, super.age, this.school);
}Adlandırılmış yapıcılarla çalışırken, hangi üst sınıf yapıcısının çağrılacağını belirtirsiniz:
class Employee extends Person {
String department;
Employee(super.name, super.age, this.department);
Employee.intern(String name, this.department) : super(name, 18);
}Temel kural basittir: Alt sınıf kendi özelliklerini eklemeden önce üst sınıfın tamamen başlatılması gerekir. İster geleneksel super() çağrısını ister daha yeni olan süper parametreleri kullanın, Dart, kalıtım zincirinin üst sınıftan alt sınıfa doğru düzgün bir şekilde oluşturulmasını sağlar.
Görev
KolayKalıtımın yapıcılarla (constructors) nasıl çalıştığını gösteren bir ürün envanter sistemi oluşturalım. Farklı ürün türlerinin bir temel ürün sınıfını genişlettiği ve her birinin üst sınıf yapıcıları aracılığıyla düzgün bir şekilde başlatılmasını gerektiren bir hiyerarşi oluşturacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
product.dart: Ürün hiyerarşinizi burada tanımlayın:String namevedouble priceözelliklerine sahip, her iki değeri de alan bir yapıcıya ve[name]: $[price]çıktısını veren birinfo()metoduna sahip birProductsınıfıProductsınıfını genişleten ve birString authorözelliği ekleyen birBooksınıfı.namevepricedeğerlerini üst sınıf yapıcısına iletmek için "super parameters" kullanınProductsınıfını genişleten ve birint warrantyözelliği (ay cinsinden) ekleyen birElectronicssınıfı. Değerleri üst sınıfa iletmek için başlatıcı listesinde (initializer list) gelenekselsuper()çağrısını kullanın
main.dart: Ürün dosyanızı içe aktarın ve her iki yapıcı kalıtımı yaklaşımını da gösterin:- Adı
'Dart Essentials', fiyatı29.99ve yazarı'Jane Smith'olan birBookoluşturun info()metodunu çağırın, ardındanAuthor: [author]yazdırın- Boş bir satır yazdırın
- Adı
'Wireless Mouse', fiyatı45.50ve garantisi24olan birElectronicsoluşturun info()metodunu çağırın, ardındanWarranty: [warranty] monthsyazdırın
- Adı
Her iki alt sınıf da info() metodunu geçersiz kılmaya (override) gerek duymadan Product sınıfından miras alır. Temel fark, üst sınıf yapıcısını nasıl çağırdıklarıdır - Book daha temiz olan "super parameters" sözdizimini kullanırken, Electronics başlatıcı listesinde super() ile geleneksel yaklaşımı kullanır.
Beklenen çıktı:
Dart Essentials: $29.99
Author: Jane Smith
Wireless Mouse: $45.5
Warranty: 24 monthsKopya kağıdı
Bir alt sınıf bir üst sınıfı genişlettiğinde (extend), devralınan alanların düzgün bir şekilde başlatılması için üst sınıfın kurucu metodunun (constructor) çağrılması gerekir.
Geleneksel yaklaşım - başlatıcı listesinde üst sınıf kurucusunu açıkça çağırmak:
class Person {
String name;
int age;
Person(this.name, this.age);
}
class Student extends Person {
String school;
Student(String name, int age, this.school) : super(name, age);
}Süper parametreler (Dart 2.17+) - parametreleri doğrudan üst sınıf kurucusuna iletmek:
class Student extends Person {
String school;
Student(super.name, super.age, this.school);
}İsimlendirilmiş kurucular - hangi üst sınıf kurucusunun çağrılacağını belirtmek:
class Employee extends Person {
String department;
Employee(super.name, super.age, this.department);
Employee.intern(String name, this.department) : super(name, 18);
}Kendin dene
import 'product.dart';
void main() {
// TODO: Şunlara sahip bir Book oluşturun:
// - name: 'Dart Essentials'
// - price: 29.99
// - author: 'Jane Smith'
// TODO: Kitabın info() metodunu çağırın
// TODO: "Author: [author]" yazdırın
// TODO: Boş bir satır yazdırın
// TODO: Şunlara sahip bir Electronics oluşturun:
// - name: 'Wireless Mouse'
// - price: 45.50
// - warranty: 24
// TODO: Elektronik cihazın info() metodunu çağırın
// TODO: "Warranty: [warranty] months" yazdı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ı