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, Dart normalde parametre türlerinin tam olarak eşleşmesini gerektirir. Ancak bazen bir alt sınıf metodunun üst sınıftakinden daha özel bir tür kabul etmesini istersiniz. covariant anahtar sözcüğü 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 oynayabilmesini sağlamak için covariant anahtar sözcüğünü kullanan bir evcil hayvan uyumluluk sistemi oluşturalım. Her türün yalnızca aynı türden bir evcil hayvanı kabul eden bir playWith yöntemine sahip olduğu bir evcil hayvan hiyerarşisi oluşturacaksın.
Kodunu iki dosyada düzenleyeceksin:
pets.dart: Evcil hayvan hiyerarşini burada tanımla:Petözelliğine ve bir oluşturucuya sahip birString namesınıfı.playWith(Pet other)yazdıran bir[name] plays with [other.name]yöntemi ekleCatsınıfını genişleten ve yalnızca birPetkabul etmek içinplayWithanahtar sözcüğünü kullanarakcovariantyöntemini geçersiz kılan birCatsınıfı.[name] and [other.name] chase yarn togetheryazdırmalıDogsınıfını genişleten ve yalnızca birPetkabul etmek içinplayWithanahtar sözcüğünü kullanarakcovariantyöntemini geçersiz kılan birDogsınıfı.[name] and [other.name] fetch the ball togetheryazdırmalıRabbitsınıfını genişleten ve yalnızca birPetkabul etmek içinplayWithanahtar sözcüğünü kullanarakcovariantyöntemini geçersiz kılan birRabbitsınıfı.[name] and [other.name] hop around togetheryazdırmalı
main.dart: Evcil hayvanları içeren dosyanı içe aktar ve her evcil hayvan türünün yalnızca kendi türüyle nasıl oynadığını göster:Catve'Whiskers'adlarında iki'Mittens'nesnesi oluştur, ardından Whiskers'ın Mittens ile oynamasını sağlaDogve'Buddy'adlarında iki'Max'nesnesi oluştur, ardından Buddy'nin Max ile oynamasını sağlaRabbitve'Flopsy'adlarında iki'Cotton'nesnesi oluştur, ardından Flopsy'nin Cotton ile oynamasını sağla
covariant anahtar sözcüğü, her alt sınıfın parametre türünü Pet türünden kendi özel türüne daraltmasına olanak tanır ve aynı türden evcil hayvanlar arasındaki etkileşimlerin tür güvenli olmasını sağlar.
Beklenen çıktı:
Whiskers and Mittens chase yarn together
Buddy and Max fetch the ball together
Flopsy and Cotton hop around togetherKendin 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
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