- Türetilmiş bir sınıf oluşturmak ve
virtual,override,baseanahtar 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).
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)";
}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.
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;
}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.
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}");
}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çüt | Soyut sınıf | Arayüz |
|---|---|---|
| Kaç tanesi kullanılabilir | yalnızca bir | istenildiği kadar |
| Alanlar ve durum | olabilir | olmaz |
| Ne zaman seçilir | yakın akraba sınıfların ortak kodu var | farklı 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
virtualbir metoduoverrideile geçersiz kılar;baseüst sınıfın sürümünü çağırır. abstractbir 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.