C#
Polimorfizmde pattern matching
switch ifadeleri ve tip kalıpları ile polimorfik dağıtımı öğrenirsin.
switch ifade ve tip kalıpları
C#'ın modern switch ifadesi (switch expression) tip kalıplarıyla (type pattern) polimorfik dağıtımı ifade seviyesinde yapar. Bir Animal nesnesini türlere göre işleyen kod artık tek satırlık bir ifade olur.
Örnek: string sound = animal switch { Dog d => "Hav", Cat c => "Miyav", _ => "?" };. Burada Dog d bir tip kalıbıdır; eşleşirse d değişkeni nesneye bağlanır. _ ise varsayılan (discard) dalıdır. Switch ifadesi bir değer döndürdüğü için değişkene atanabilir.
when ile ek koşul
Bazen sadece türe bakmak yetmez; aynı tür içinde ek koşul gerekir. Bunun için when yan tümcesini kullanırsın. Dog d when d.Age > 5 şeklinde bir dal yalnızca yaşı 5'ten büyük köpekleri yakalar.
when, tip kalıbından sonra filtre uygular. Bu sayede daha ince ayırt edici dallar yazabilirsin. Sıralama önemlidir: yukarıdaki dallar önce denenir, eşleşen ilk dal çalışır. Varsayılan dalı her zaman en sona koy. Aksi halde derleyici uyarı verir.
Uygulama switch ifadesi ile ses üret
Animal sınıfı tanımla. Dog : Animal ve Cat : Animal sınıflarını tanımla. Program içinde static string Sound(Animal a) metodu yaz; switch ifadesi kullansın: Dog için "Hav", Cat için "Miyav", varsayılan için "?" döndürsün. Main içinde Dog, Cat, Animal nesneleriyle Sound çağırıp Console.WriteLine yaz.
Örnek çözümü göster
static string Sound(Animal a) { return a switch { Dog d => "Hav", Cat c => "Miyav", _ => "?" }; } yaz. Main'de Console.WriteLine(Sound(new Dog())); Console.WriteLine(Sound(new Cat())); Console.WriteLine(Sound(new Animal())); ekle.
Örnek çözüm:
using System;
class Animal { }
class Dog : Animal { }
class Cat : Animal { }
class Program
{
static string Sound(Animal a)
{
return a switch
{
Dog d => "Hav",
Cat c => "Miyav",
_ => "?"
};
}
static void Main()
{
Console.WriteLine(Sound(new Dog()));
Console.WriteLine(Sound(new Cat()));
Console.WriteLine(Sound(new Animal()));
}
}
Kendini test et
-
switch ifadesinde hangisi varsayılan daldır?
var s = a switch {
Dog d => "Hav",
_ => "?"
};
- default =>
- else =>
- null =>
- _ =>
Cevabı göster
_ => — Doğru. _ (discard) switch ifadesinde varsayılan daldır.
-
Tip kalıbı ile değişken bağla
if (animal ____ Dog d) { d.Bark(); }
Cevabı göster
if (animal is Dog d) { d.Bark(); }
-
Desen parçasını anlamına eşle
- switch
- İfadeye göre dallanır
- =>
- Ok ifadesi
- is
- Tip kalıbı test eder
- when
- Ek koşul ekler
Sıradaki ders: Virtual dispatch