CodeBlanks Logo Icon CodeBlanks

Özet - Variance

Variance kurallarını karşılaştıran bir program yazarsın.

Özet - Variance

Variance kuralları bir alt tür ilişkisinin fonksiyon türlerine nasıl aktığını anlatır. Covariance ilişkiyi aynı yönde korur (dönüş türü, diziler). Contravariance ilişkiyi ters çevirir (parametre türü, strictFunctionTypes altında). Bivariance her iki yönü de kabul eder (method shorthand veya strict kapalıyken).

class Animal {}
class Dog extends Animal {}

// Covariance (dönüş türü):
const a: () => Animal = () => new Dog();

// Contravariance (parametre, strict altında):
const b: (d: Dog) => void = (x: Animal) => {};

// Bivariance (method shorthand):
interface Kennel { keep(d: Dog): void; }
const k: Kennel = { keep(x: Animal) {} };

Uygulama Üç kuralı tek programda göster

Animal'dan türeyen Dog sınıfını tanımla. Üç şeyi göster: (1) Covariance: () => Dog fonksiyonunu () => Animal türüne ata ve dönen nesnenin name özelliğini yazdır. (2) Contravariance: (a: Animal) => void fonksiyonunu (d: Dog) => void türüne ata. (3) Bivariance: keep(d: Dog): void methodu olan Kennel interface'i yaz ve implementation'ı keep(a: Animal) {} ile uygula. Her bölümün başında console.log ile sırasıyla "covariance", "contravariance", "bivariance" etiketlerini yazdır.

Başlangıç kodu

index.ts
class Animal {
  name = "animal";
}

// Dog sınıfını tanımla

// 1) Covariance: () => Dog -> () => Animal

// 2) Contravariance: (a: Animal) => void -> (d: Dog) => void

// 3) Bivariance: Kennel interface ve implementation

Örnek çözüm

index.ts
class Animal {
  name = "animal";
}

class Dog extends Animal {}

console.log("covariance");
const makeAnimal: () => Animal = () => new Dog();
console.log(makeAnimal().name);

console.log("contravariance");
const dogHandler: (d: Dog) => void = (a: Animal) => {};
dogHandler(new Dog());

console.log("bivariance");
interface Kennel {
  keep(d: Dog): void;
}
const k: Kennel = {
  keep(a: Animal) {}
};
k.keep(new Dog());

Beklenen çıktı

covariance
animal
contravariance
bivariance

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Bir fonksiyon türünde dönüş türü nasıl denetlenir (strictFunctionTypes açık)?

  • Invariant
  • Contravariant
  • Covariant Doğru cevap
  • Bivariant

Açıklama: Dönüş türü her zaman covariant denetlenir; alt tür döndüren fonksiyon, üst tür döndüren beklentiye atanır.

2 Contravariant parametre için hangi tür

Soru
class Animal {}
class Dog extends Animal {}

// Contravariance örneği: h, Dog beklerken implementation Animal kabul eder
const h: (d: Dog) => void = (x: ____) => {};
Cevap
class Animal {}
class Dog extends Animal {}

// Contravariance örneği: h, Dog beklerken implementation Animal kabul eder
const h: (d: Dog) => void = (x: Animal) => {};

Açıklama: Contravariance için parametre, hedefin parametresinin üst türü olmalıdır; Animal, Dog'un üst türü olduğundan doğrudur.

3 Variance kuralları eşleştirmesi

Kavram Anlamı
Dönüş türü Covariance
Parametre (strict altında) Contravariance
Method shorthand Bivariance
Dog döndüren fonksiyon Animal döndüren beklentiye atanır

İleri seviye bölümündeki tüm dersler