İçeriğe geç
Educora
Orta20 dk7 / 16

Kalıtım, arayüzler ve çok biçimlilik

Var olan sınıflardan yeni sınıflar türet, metotları `virtual` ve `override` ile geçersiz kıl; soyut sınıflar ve arayüzlerle aynı kodun farklı nesnelerle çalışmasını sağla.

Kendini test et
Bu derste öğreneceklerin
  • Türetilmiş bir sınıf oluşturmak ve virtual, override, base anahtar sözcüklerini kullanmak
  • Soyut sınıfların ve soyut metotların ne işe yaradığını açıklamak
  • Bir arayüz tanımlamak ve onu birkaç sınıfta uygulamak
  • Çok biçimliliği örneklerle açıklamak

Bir oyunda köpek, kedi ve papağan var. Hepsinin adı var ve hepsi kendini tanıtabiliyor ama her biri farklı bir ses çıkarıyor. Aynı kodu üç kez kopyalamak yerine ortak kısmı bir temel sınıfa koyar, farkları ise türetilmiş sınıflarda yazarız. Sonra tüm hayvanlarla tek bir döngüde, aynı kodla çalışırız. Bu, nesne yönelimli programlamanın en güçlü fikirlerinden biridir.

Kalıtım: virtual ve override

class Dog : Animal yazımı, Dog sınıfının Animal'dan türediğini belirtir: üst sınıfın tüm public üyelerini alır. Temel sınıfta virtual olarak işaretlenen bir metodu türetilmiş sınıf override ile geçersiz kılabilir. base anahtar sözcüğü, üst sınıfın sürümünü çağırmayı sağlar. Birincil yapıcılarda argüman doğrudan üst sınıfın yapıcısına verilir: : Animal(name).

C#
List<Animal> pets = [new Dog("Rex"), new Cat("Mestan"), new Animal("Nemo")];

foreach (Animal pet in pets)
    Console.WriteLine(pet.Introduce());

class Animal(string name)
{
    public string Name => name;
    public virtual string Speak() => "...";
    public virtual string Introduce() => $"I am {Name} and I say {Speak()}";
}

class Dog(string name) : Animal(name)
{
    public override string Speak() => "Woof!";
}

class Cat(string name) : Animal(name)
{
    public override string Speak() => "Meow!";
    public override string Introduce() => base.Introduce() + " (and ignores you)";
}
Beklenen çıktı
I am Rex and I say Woof!
I am Mestan and I say Meow! (and ignores you)
I am Nemo and I say ...

Dikkat et: listenin türü List<Animal> ama pet.Introduce() çağrıldığında her nesne kendi Speak metodunu kullanıyor. Aynı çağrının nesnenin gerçek türüne göre farklı sonuç vermesine çok biçimlilik (polimorfizm) denir. Döngü köpekler, kediler ya da ileride eklenecek bir papağan hakkında hiçbir şey bilmez ve bilmesi de gerekmez.

Soyut sınıflar

Bazen temel sınıf tek başına eksiktir: genel bir “şeklin” alanı hesaplanamaz, alan ancak belirli bir dikdörtgen ya da daire için bulunabilir. Böyle bir sınıf abstract olarak tanımlanır. Ondan nesne oluşturulamaz (new Shape() CS0144 hatası verir) ve gövdesiz abstract metotlarını her türetilmiş sınıf mutlaka uygulamalıdır; yoksa CS0534 hatası oluşur.

C#
using System.Globalization;

CultureInfo.CurrentCulture = CultureInfo.InvariantCulture;

Shape[] shapes = [new Rectangle(4, 3), new Square(5), new Circle(1)];
foreach (Shape s in shapes)
    Console.WriteLine($"{s.GetType().Name}: area {s.Area():F2}");

abstract class Shape
{
    public abstract double Area();
}

class Rectangle(double width, double height) : Shape
{
    public override double Area() => width * height;
}

class Square(double side) : Rectangle(side, side);

class Circle(double radius) : Shape
{
    public override double Area() => Math.PI * radius * radius;
}
Beklenen çıktı
Rectangle: area 12.00
Square: area 25.00
Circle: area 3.14
Square, Rectangle'dan türer ve onun Area metodunu olduğu gibi kullanır; bir gövdeye bile ihtiyacı olmadı.

Arayüzler

Bir arayüz (interface) bir sözleşmedir: bir sınıfın hangi metotlara ve özelliklere sahip olması gerektiğini söyler ama bunların nasıl çalıştığını söylemez. Arayüz adları geleneksel olarak I harfiyle başlar: INotifier, IComparable. Bir sınıf : INotifier yazarak sözleşmeyi kabul eder ve tüm üyelerini uygulamak zorundadır. Birbiriyle hiç ilgisi olmayan sınıflar bile aynı arayüzü uygulayabilir.

C#
List<INotifier> notifiers =
[
    new EmailNotifier("aysel@example.com"),
    new SmsNotifier("+994 50 000 00 00")
];

foreach (INotifier n in notifiers)
    n.Send("Your order has shipped!");

interface INotifier
{
    void Send(string message);
}

class EmailNotifier(string address) : INotifier
{
    public void Send(string message) => Console.WriteLine($"Email to {address}: {message}");
}

class SmsNotifier(string phone) : INotifier
{
    public void Send(string message) => Console.WriteLine($"SMS to {phone}: {message}");
}
Beklenen çıktı
Email to aysel@example.com: Your order has shipped!
SMS to +994 50 000 00 00: Your order has shipped!

Yarın Telegram bildirimleri gerekirse yalnızca INotifier'ı uygulayan yeni bir TelegramNotifier sınıfı yazılır; döngüye dokunmak gerekmez. .NET'in kendisi de arayüzlerle doludur: IComparable<T> nesnelerin sıralanmasını, IEnumerable<T> ise foreach ile dolaşılmasını sağlar.

ÖlçütSoyut sınıfArayüz
Kaç tanesi kullanılabiliryalnızca biristenildiği kadar
Alanlar ve durumolabilirolmaz
Ne zaman seçiliryakın akraba sınıfların ortak kodu varfarklı sınıflar aynı yeteneği paylaşıyor

Önemli noktalar

  • class Dog : Animal: Dog, Animal'dan türer ve üyelerini alır; bir sınıfın yalnızca bir temel sınıfı olur.
  • Türetilmiş sınıf virtual bir metodu override ile geçersiz kılar; base üst sınıfın sürümünü çağırır.
  • abstract bir sınıftan nesne oluşturulamaz; soyut metotlarını türetilmiş sınıflar uygular.
  • Arayüz bir sözleşmedir; bir sınıf birden fazla arayüz uygulayabilir.
  • Çok biçimlilik: aynı çağrı, nesnenin gerçek türüne göre farklı çalışır.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
Türetilmiş bir sınıfta üst sınıfın metodunu geçersiz kılmak için hangi anahtar sözcük kullanılır?