Çoklu Arayüzler
Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 27 / 70.
Bir class yalnızca bir base class'tan miras alabilirken, ihtiyaç duyulduğu kadar interface implement edebilir. Bu, interface'lerin abstract class'lara göre sahip olduğu temel avantajlardan biridir; bir class'ın birden fazla davranış edinmesine olanak tanırlar.
Birden fazla arayüzü uygulamak için, bunları iki noktadan sonra virgülle ayırarak listelemeniz yeterlidir:
public interface IFlyable
{
void Fly();
}
public interface ISwimmable
{
void Swim();
}
public class Duck : IFlyable, ISwimmable
{
public void Fly()
{
Console.WriteLine("Flying through the air");
}
public void Swim()
{
Console.WriteLine("Swimming in the pond");
}
}Duck sınıfı her iki arayüzdeki tüm üyeleri uygulamalıdır. Bu, gerçek dünya senaryolarını doğal bir şekilde modeller - bir ördek gerçekten hem uçabilir hem de yüzebilir, bu nedenle her iki sözleşmeyi de yerine getirmesi mantıklıdır.
Kalıtımı birden fazla arayüzle birleştirirken, temel sınıf ilk sırada gelmelidir:
public class Duck : Bird, IFlyable, ISwimmable
{
// Bird'den kalıtım alır, her iki arayüzü de uygular
}Bu esneklik, davranışları birden fazla kaynaktan oluşturmanıza olanak tanır. Bir Robot; IMovable, IChargeable ve ISpeakable arayüzlerini uygulayabilir. Her arayüz tek bir yeteneği temsil eder ve sınıfınız tam olarak neye ihtiyacı varsa onu karıştırıp eşleştirebilir.
Görev
KolayTek bir sınıfın farklı yetenekler kazanmak için birden fazla arayüzü (interface) nasıl uygulayabileceğini gösteren bir akıllı ev cihaz sistemi oluşturalım. Hem kontrol edilebilir hem de güç yönetimi özelliklerine sahip cihazlar oluşturacaksınız.
Kodunuzu dört dosya halinde düzenleyeceksiniz:
IControllable.cs:SmartHomead alanı (namespace) içindeIControllableadında bir arayüz tanımlayın. Bu arayüz, açılıp kapatılabilen cihazları temsil eder. Her ikisi de string döndüren iki yöntem bildirmelidir:TurnOn()veTurnOff().INetworkConnected.cs:SmartHomead alanı içindeINetworkConnectedadında bir arayüz tanımlayın. Bu arayüz, bir ağa bağlanabilen cihazları temsil eder. String döndüren birConnect(string network)yöntemi bildirmelidir.SmartTV.cs:SmartHomead alanı içinde hemIControllablehem deINetworkConnectedarayüzlerini uygulayan birSmartTVsınıfı tanımlayın. TV'nin birBrandözelliği (string) ve birScreenSizeözelliği (int, inç cinsinden) olmalıdır. Her iki değeri de kabul eden bir yapıcı (constructor) oluşturun. Tüm arayüz yöntemlerini uygulayın:TurnOn()yöntemi"{Brand} {ScreenSize}-inch TV is now ON"döndürürTurnOff()yöntemi"{Brand} {ScreenSize}-inch TV is now OFF"döndürürConnect(string network)yöntemi"{Brand} TV connected to {network}"döndürür
Program.cs: Ana dosyanızda, giriş değerlerini kullanarak birSmartTVoluşturun. Aynı TV nesnesini üç farklı değişken türünde saklayarak birden fazla arayüzün esnekliğini gösterin: somutSmartTVtürü, birIControllabledeğişkeni ve birINetworkConnecteddeğişkeni. Aynı nesnenin hangi arayüzle çalıştığınıza bağlı olarak nasıl farklı davranabileceğini göstermek için her bir referans üzerinden uygun yöntemleri çağırın.
Üç giriş alacaksınız:
- TV marka adı
- İnç cinsinden ekran boyutu
- Bağlanılacak ağ adı
Çıktıyı şu formatta yazdırın:
Via SmartTV:
{TurnOn() result}
{Connect(network) result}
Via IControllable:
{TurnOff() result}
Via INetworkConnected:
{Connect(network) result}Örneğin, girişler Samsung, 55 ve HomeWiFi ise çıktı şöyle olmalıdır:
Via SmartTV:
Samsung 55-inch TV is now ON
Samsung TV connected to HomeWiFi
Via IControllable:
Samsung 55-inch TV is now OFF
Via INetworkConnected:
Samsung TV connected to HomeWiFiAynı SmartTV nesnesine farklı arayüz referansları üzerinden nasıl erişilebildiğine dikkat edin. IControllable olarak saklandığında, yalnızca kontrol yöntemlerini çağırabilirsiniz. INetworkConnected olarak saklandığında, yalnızca ağ yöntemlerini çağırabilirsiniz. Birden fazla arayüz uygulamanın gücü budur - bir sınıf, nasıl kullanıldığı konusunda esnek kalırken birden fazla yetenek kazanır!
Kopya kağıdı
Bir sınıf, iki noktadan sonra virgülle ayırarak listeleyerek birden fazla arayüzü uygulayabilir:
public interface IFlyable
{
void Fly();
}
public interface ISwimmable
{
void Swim();
}
public class Duck : IFlyable, ISwimmable
{
public void Fly()
{
Console.WriteLine("Flying through the air");
}
public void Swim()
{
Console.WriteLine("Swimming in the pond");
}
}Sınıf, tüm arayüzlerdeki tüm üyeleri uygulamalıdır.
Kalıtımı birden fazla arayüzle birleştirirken, temel sınıf en başta gelmelidir:
public class Duck : Bird, IFlyable, ISwimmable
{
// Bird sınıfından kalıtım alır, her iki arayüzü de uygular
}Bu, her bir arayüzün tek bir yeteneği temsil ettiği, birden fazla kaynaktan davranışlar oluşturmaya olanak tanır.
Kendin dene
using System;
using SmartHome;
class Program
{
public static void Main(string[] args)
{
// Girdileri oku
string brand = Console.ReadLine();
int screenSize = Convert.ToInt32(Console.ReadLine());
string network = Console.ReadLine();
// TODO: Giriş değerleri ile bir SmartTV nesnesi oluşturun
// TODO: Aynı TV nesnesini üç farklı değişken türünde saklayın:
// 1. SmartTV türü (somut sınıf)
// 2. IControllable türü (arayüz referansı)
// 3. INetworkConnected türü (arayüz referansı)
// TODO: Çıktıyı istenen formatta yazdırın:
// SmartTV aracılığıyla:
// - TurnOn() ve Connect(network) metodlarını çağırın
// IControllable aracılığıyla:
// - TurnOff() metodunu çağırın
// INetworkConnected aracılığıyla:
// - Connect(network) metodunu çağırın
}
}
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
1OOP Temelleri
Harici Dosyalarİsim Alanları ve YönergelerSınıf ve Nesnelere Giriş'this' Anahtar KelimesiMetotlar ve ParametrelerAlanlar ve ÖzelliklerYapıcı MetotlarNesne BaşlatıcılarÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (:) Sözdizimi'base' Anahtar KelimesiVirtual ve Override Anahtar KelimeleriSealed Sınıflar'object' Temel SınıfıÖzet - Çalışan Hiyerarşisi7İleri Düzey Özellikler
Operatör Aşırı Yüklemeİndeksleyiciler (this[])ToString() Geçersiz KılmaGenişletme MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişThread-Safe SingletonFactory KalıbıObserver Kalıbı (Olaylar)Strategy Kalıbı2Özellikler ve Statik Üyeler
Otomatik Uygulanan ÖzelliklerSadece Okunur/Yazılır ÖzelliklerStatik Alanlar ve MetotlarStatik Sınıflarİfade Gövdeli Üyeler5Polimorfizm ve Arayüzler
Derleme vs Çalışma Zamanı PolimorfizmiArayüz vs Soyut SınıfÇoklu ArayüzlerBelirgin ArayüzlerUpcasting ve DowncastingÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kalıtım yerine KompozisyonGenerics (Sınıflar ve Metotlar)Delegates ve EventlerAttributes ve ReflectionIDisposable ve using İfadesiDependency Injection Temelleri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit Kalıbı3Sınıf Mimarisi
Örnek vs Statik Veri'readonly' ve 'const' Anahtar KelimeleriDestekleyici Alanlar (Backing Fields)Özet - Banka Hesabı Yöneticisi6Kapsülleme
Erişim BelirleyicilerKapsülleme için ÖzelliklerVeri Gizleme UygulamasıDeğişmezlik KalıplarıÖzet - Öğrenci Kayıtları