Covariant Anahtar Kelimesi
Coddy'nin Dart Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 61 / 110.
Bir alt sınıfta bir metodu geçersiz kıldığınızda (override ettiğinizde), Dart normalde parametre türlerinin tam olarak eşleşmesini gerektirir. Ancak bazen bir alt sınıf metodunun, üst sınıftakinden (parent) daha spesifik bir türü kabul etmesini isteyebilirsiniz. covariant anahtar kelimesi buna olanak tanır.
Bir Animal sınıfının başka bir Animal nesnesini kabul eden bir metoda sahip olduğu bir senaryoyu düşünün:
class Animal {
void chase(Animal other) {
print('Chasing an animal');
}
}
class Dog extends Animal {
@override
void chase(covariant Dog other) {
print('Dog chasing another dog');
}
}covariant olmadan Dart, Dog tipinin Animal ile aynı tip olmadığından şikayet ederdi. Parametreden önce covariant ekleyerek Dart'a şunu söylersiniz: "Bunun daha spesifik olduğunu biliyorum ve yalnızca doğru tipin geçirilmesini sağlayacağım."
Bu, alt sınıfların mantıksal olarak yalnızca kendi türleriyle çalışması gerektiğinde yararlıdır:
void main() {
Dog dog1 = Dog();
Dog dog2 = Dog();
dog1.chase(dog2); // Çalışır: Başka bir köpeği kovalayan köpek
}Ancak dikkatli olun; covariant kullanmak, tür güvenliğini çalışma zamanına kaydırır. Metodu yanlış türdeki bir üst referans üzerinden çağırırsanız, derleme zamanı hatası yerine çalışma zamanı hatası alırsınız. Bunu, geçirilen türlerden emin olduğunuzda kullanın.
Görev
KolayEvcil hayvanların yalnızca kendi türleriyle oynamasını sağlamak için covariant anahtar kelimesini kullanan bir evcil hayvan uyumluluk sistemi kuralım. Her türün yalnızca aynı türden bir evcil hayvanı kabul eden bir playWith metoduna sahip olduğu bir evcil hayvan hiyerarşisi oluşturacaksınız.
Kodunuzu iki dosya halinde düzenleyeceksiniz:
pets.dart: Evcil hayvan hiyerarşinizi burada tanımlayın:- Bir
String nameözelliğine ve bir yapıcıya (constructor) sahip birPetsınıfı.[name] plays with [other.name]yazdıran birplayWith(Pet other)metodu ekleyin. Petsınıfını genişleten ve yalnızca birCatkabul etmek içincovariantanahtar kelimesini kullanarakplayWithmetodunu geçersiz kılan (override) birCatsınıfı. Bu metot[name] and [other.name] chase yarn togetheryazdırmalıdır.Petsınıfını genişleten ve yalnızca birDogkabul etmek içincovariantanahtar kelimesini kullanarakplayWithmetodunu geçersiz kılan birDogsınıfı. Bu metot[name] and [other.name] fetch the ball togetheryazdırmalıdır.Petsınıfını genişleten ve yalnızca birRabbitkabul etmek içincovariantanahtar kelimesini kullanarakplayWithmetodunu geçersiz kılan birRabbitsınıfı. Bu metot[name] and [other.name] hop around togetheryazdırmalıdır.
- Bir
main.dart: Evcil hayvanlar dosyanızı içe aktarın ve her evcil hayvan türünün yalnızca kendi türüyle nasıl oynadığını gösterin:'Whiskers've'Mittens'adında ikiCatnesnesi oluşturun, ardından Whiskers'ın Mittens ile oynamasını sağlayın.'Buddy've'Max'adında ikiDognesnesi oluşturun, ardından Buddy'nin Max ile oynamasını sağlayın.'Flopsy've'Cotton'adında ikiRabbitnesnesi oluşturun, ardından Flopsy'nin Cotton ile oynamasını sağlayın.
covariant anahtar kelimesi, her alt sınıfın parametre türünü Pet'ten kendi özel türüne daraltmasına olanak tanıyarak aynı türden evcil hayvanlar arasında tür açısından güvenli (type-safe) etkileşimler sağlar.
Beklenen çıktı:
Whiskers and Mittens chase yarn together
Buddy and Max fetch the ball together
Flopsy and Cotton hop around togetherKopya kağıdı
covariant anahtar kelimesi, bir alt sınıfın bir metodu, üst sınıftaki parametre türünden daha spesifik bir parametre türüyle geçersiz kılmasına (override) olanak tanır.
covariant olmadan, Dart metotları geçersiz kılarken parametre türlerinin tam olarak eşleşmesini gerektirir. covariant ile alt sınıftaki parametre türünü daraltabilirsiniz:
class Animal {
void chase(Animal other) {
print('Chasing an animal');
}
}
class Dog extends Animal {
@override
void chase(covariant Dog other) {
print('Dog chasing another dog');
}
}Bu, alt sınıfların yalnızca kendi türleriyle çalışması gerektiğinde kullanışlıdır:
void main() {
Dog dog1 = Dog();
Dog dog2 = Dog();
dog1.chase(dog2); // Çalışır: Dog chasing another dog
}Önemli: covariant kullanmak, tür güvenliğini derleme zamanından çalışma zamanına kaydırır. Eğer metodu yanlış türde bir üst sınıf referansı üzerinden çağırırsanız, derleme zamanı hatası yerine çalışma zamanı hatası alırsınız.
Kendin dene
import 'pets.dart';
void main() {
// TODO: 'Whiskers' ve 'Mittens' adında iki Cat nesnesi oluşturun
// Ardından Whiskers'ın Mittens ile oynamasını sağlayın
// TODO: 'Buddy' ve 'Max' adında iki Dog nesnesi oluşturun
// Ardından Buddy'nin Max ile oynamasını sağlayın
// TODO: 'Flopsy' ve 'Cotton' adında iki Rabbit nesnesi oluşturun
// Ardından Flopsy'nin Cotton ile oynamasını sağlayı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ı