Çoklu Arayüzler
Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 27 / 70.
Bir sınıf yalnızca bir temel sınıftan kalıtım alabilirken, ihtiyaç duyduğu kadar çok arabirim uygulayabilir. Bu, arabirimlerin soyut sınıflara göre sahip olduğu temel avantajlardan biridir; bir sınıfın birden fazla davranışı benimsemesine olanak tanırlar.
Birden fazla arayüzü uygulamak için iki noktadan sonra bunları virgüllerle 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; dolayısıyla her iki sözleşmeyi de yerine getirmesi mantıklıdır.
Kalıtımı birden çok arayüzle birleştirirken temel sınıf önce gelmelidir:
public class Duck : Bird, IFlyable, ISwimmable
{
// Bird'den miras alır, her iki arayüzü de uygular
}Bu esneklik, davranışları birden çok kaynaktan oluşturmanı sağlar. Bir Robot, IMovable, IChargeable ve ISpeakable uygulayabilir. Her arayüz tek bir yeteneği temsil eder ve sınıfın tam olarak ihtiyaç duyduğu yetenekleri bir araya getirebilir.
Görev
KolayFarklı yetenekler kazanmak için tek bir sınıfın birden fazla arayüzü nasıl uygulayabileceğini gösteren bir akıllı ev cihazı sistemi oluşturalım. Hem kontrol edilebilen hem de güç yönetimi özelliklerine sahip cihazlar oluşturacaksın.
Kodunu dört dosya arasında düzenleyeceksin:
IControllable.cs:IControllablead alanındaSmartHomeadlı bir arayüz tanımla. Bu arayüz, açılıp kapatılabilen cihazları temsil eder. Her ikisi de string döndüren iki yöntem tanımlamalıdır:TurnOn()veTurnOff().INetworkConnected.cs:INetworkConnectedad alanındaSmartHomeadlı bir arayüz tanımla. Bu arayüz, bir ağa bağlanabilen cihazları temsil eder. String döndürenConnect(string network)yöntemini tanımlamalıdır.SmartTV.cs:SmartTVad alanında hemSmartHomehem deIControllablearayüzlerini uygulayan birINetworkConnectedsınıfı tanımla. TV'nin birBrandözelliği (string) ve birScreenSizeözelliği (int, inç cinsinden) olmalıdır. Her iki değeri kabul eden bir oluşturucu oluştur. Tüm arayüz yöntemlerini uygula:TurnOn(),"{Brand} {ScreenSize}-inch TV is now ON"döndürürTurnOff(),"{Brand} {ScreenSize}-inch TV is now OFF"döndürürConnect(string network),"{Brand} TV connected to {network}"döndürür
Program.cs: Ana dosyanda, giriş değerlerini kullanarak birSmartTVoluştur. Aynı TV nesnesini üç farklı değişken türünde depolayarak birden fazla arayüzün esnekliğini göster: somutSmartTVtürü, birIControllabledeğişkeni ve birINetworkConnecteddeğişkeni. Aynı nesnenin, üzerinde çalıştığın arayüze bağlı olarak farklı şekilde ele alınabileceğini göstermek için uygun yöntemleri her başvuru üzerinden çağır.
Üç girdi alacaksın:
- TV marka adı
- İnç cinsinden ekran boyutu
- Bağlanılacak ağ adı
Çıktıyı şu biçimde yazdır:
Via SmartTV:
{TurnOn() result}
{Connect(network) result}
Via IControllable:
{TurnOff() result}
Via INetworkConnected:
{Connect(network) result}Örneğin girdiler Samsung, 55 ve HomeWiFi ise çıktı şu şekilde 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 başvuruları üzerinden erişilebildiğine dikkat et. IControllable olarak depolandığında yalnızca kontrol yöntemlerini çağırabilirsin. INetworkConnected olarak depolandığında yalnızca ağ yöntemlerini çağırabilirsin. Birden fazla arayüz uygulamanın gücü budur: tek bir sınıf, kullanım biçiminde esnekliğini korurken birden fazla yetenek kazanı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: Girdi değerleriyle bir SmartTV nesnesi oluştur
// TODO: Aynı TV nesnesini üç farklı değişken türünde sakla:
// 1. SmartTV türü (somut sınıf)
// 2. IControllable type (interface reference)
// 3. INetworkConnected type (interface reference)
// TODO: Çıktıyı gerekli formatta yazdır:
// Via SmartTV:
// - TurnOn() ve Connect(network) çağır
// Via IControllable:
// - TurnOff() çağır
// Via INetworkConnected:
// - Connect(network) çağır
}
}
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ıKendi başına pratik yap: Online C# derleyicisi