Menu
Coddy logo textTech

Ç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.

challenge icon

Görev

Kolay

Farklı 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: IControllable ad alanında SmartHome adlı 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() ve TurnOff().
  • INetworkConnected.cs: INetworkConnected ad alanında SmartHome adlı bir arayüz tanımla. Bu arayüz, bir ağa bağlanabilen cihazları temsil eder. String döndüren Connect(string network) yöntemini tanımlamalıdır.
  • SmartTV.cs: SmartTV ad alanında hem SmartHome hem de IControllable arayüzlerini uygulayan bir INetworkConnected sınıfı tanımla. TV'nin bir Brand özelliği (string) ve bir ScreenSize ö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ür
    • TurnOff(), "{Brand} {ScreenSize}-inch TV is now OFF" döndürür
    • Connect(string network), "{Brand} TV connected to {network}" döndürür
  • Program.cs: Ana dosyanda, giriş değerlerini kullanarak bir SmartTV oluştur. Aynı TV nesnesini üç farklı değişken türünde depolayarak birden fazla arayüzün esnekliğini göster: somut SmartTV türü, bir IControllable değişkeni ve bir INetworkConnected değ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 HomeWiFi

Aynı 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
        
    }
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online C# derleyicisi