Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Evcil 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 bir Pet sınıfı. [name] plays with [other.name] yazdıran bir playWith(Pet other) metodu ekleyin.
    • Pet sınıfını genişleten ve yalnızca bir Cat kabul etmek için covariant anahtar kelimesini kullanarak playWith metodunu geçersiz kılan (override) bir Cat sınıfı. Bu metot [name] and [other.name] chase yarn together yazdırmalıdır.
    • Pet sınıfını genişleten ve yalnızca bir Dog kabul etmek için covariant anahtar kelimesini kullanarak playWith metodunu geçersiz kılan bir Dog sınıfı. Bu metot [name] and [other.name] fetch the ball together yazdırmalıdır.
    • Pet sınıfını genişleten ve yalnızca bir Rabbit kabul etmek için covariant anahtar kelimesini kullanarak playWith metodunu geçersiz kılan bir Rabbit sınıfı. Bu metot [name] and [other.name] hop around together yazdırmalıdır.
  • 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 iki Cat nesnesi oluşturun, ardından Whiskers'ın Mittens ile oynamasını sağlayın.
    • 'Buddy' ve 'Max' adında iki Dog nesnesi oluşturun, ardından Buddy'nin Max ile oynamasını sağlayın.
    • 'Flopsy' ve 'Cotton' adında iki Rabbit nesnesi 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 together

Kopya 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
  
}
quiz iconKendini test et

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