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

challenge icon

Görev

Kolay

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

Aynı 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
        
    }
}
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