Menu
Coddy logo textTech

Belirgin Arayüzler

Coddy'nin C# Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 28 / 70.

Bir sınıf, aynı ada sahip üyelere sahip birden çok arabirim uyguladığında ad çakışmasıyla karşılaşırsınız. Açık arabirim uygulaması, her arabirim için ayrı uygulamalar sağlamanıza olanak tanıyarak bu sorunu çözer.

Açık uygulama (explicit implementation) ile, üye adının önüne arayüz adını getirirsiniz ve erişim belirleyicisini atlarsınız:

public interface IAmericanPlug
{
    void Connect();
}

public interface IEuropeanPlug
{
    void Connect();
}

public class UniversalAdapter : IAmericanPlug, IEuropeanPlug
{
    void IAmericanPlug.Connect()
    {
        Console.WriteLine("Connected to 120V");
    }
    
    void IEuropeanPlug.Connect()
    {
        Console.WriteLine("Connected to 220V");
    }
}

Açıkça uygulanan üyelere yalnızca arayüz türündeki bir değişken aracılığıyla erişilebilir, sınıfın kendisi üzerinden erişilemez:

var adapter = new UniversalAdapter();
// adapter.Connect();  // Derlenmeyecek!

IAmericanPlug american = adapter;
american.Connect();  // 120V'a bağlandı

IEuropeanPlug european = adapter;
european.Connect();  // 220V'a bağlandı

Bu teknik, arayüz üyelerini sınıfın genel API'sinden gizlemek istediğinizde de yararlıdır. Bir yöntem yalnızca nesneye belirli bir arayüz olarak yaklaşıldığında anlamlıysa, açık uygulama (explicit implementation) sözleşmeyi yerine getirirken sınıfınızın yüzey alanını temiz tutar.

challenge icon

Görev

Kolay

Tek bir sınıfın, kullanılan arayüze bağlı olarak farklı davranışlar sunmasını sağlayan açık arayüz uygulamasının nasıl çalıştığını gösteren bir rapor oluşturma sistemi geliştirelim. Görüntüleme ve yazdırma için farklı biçimlendirilebilen bir belge oluşturacaksın.

Kodunu dört dosya arasında düzenleyeceksin:

  • IDisplayable.cs: IDisplayable ad alanında Reports adlı bir arayüz tanımla. Bu arayüz, ekranda gösterilebilen içeriği temsil eder. Bir dize döndüren Render() metodunu bildirmelidir.
  • IPrintable.cs: IPrintable ad alanında Reports adlı bir arayüz tanımla. Bu arayüz, yazıcıya gönderilebilen içeriği temsil eder. O da bir dize döndüren Render() metodunu bildirmelidir - bunun IDisplayable ile bir ad çakışması oluşturduğuna dikkat et!
  • Report.cs: Report ad alanında hem Reports hem de IDisplayable uygulayan bir IPrintable sınıfı tanımla. Raporun bir Title özelliği (string) ve bir Content özelliği (string) olmalı; ayrıca her iki değeri de ayarlayan bir kurucu içermelidir. Farklı Render() davranışları sağlamak için açık arayüz uygulamasını kullan:
    • Ekranda görüntülendiğinde: "[SCREEN] {Title}: {Content}"
    • Yazdırıldığında: "[PRINT] {Title} | {Content}"
  • Program.cs: Ana dosyanda, giriş değerlerini kullanarak bir Report oluştur. Açık uygulamalara yalnızca arayüz değişkenleri üzerinden erişilebildiğinden aynı raporu hem bir IDisplayable değişkeninde hem de bir IPrintable değişkeninde sakla; ardından hangi arayüzü kullandığına bağlı olarak aynı nesnenin nasıl farklı çıktı ürettiğini göstermek için her birinde Render() metodunu çağır.

İki giriş alacaksın:

  • Rapor başlığı
  • Rapor içeriği

Çıktıyı şu biçimde yazdır:

Display version:
{Render() via IDisplayable}
Print version:
{Render() via IPrintable}

Örneğin girişler Sales Report ve Q4 revenue increased by 15% ise çıktı şu şekilde olmalıdır:

Display version:
[SCREEN] Sales Report: Q4 revenue increased by 15%
Print version:
[PRINT] Sales Report | Q4 revenue increased by 15%

Aynı Report nesnesinin, ona erişmek için kullandığın arayüz başvurusuna bağlı olarak nasıl farklı davrandığına dikkat et. Açık arayüz uygulamasının gücü budur - ad çakışmalarını çözerken bağlama uygun davranış sağlamak!

Kendin dene

using System;
using Reports;

class Program
{
    public static void Main(string[] args)
    {
        // Girdiyi oku
        string title = Console.ReadLine();
        string content = Console.ReadLine();

        // TODO: title ve content ile bir Report nesnesi oluşturun

        // TODO: Raporu bir IDisplayable değişkeninde saklayın

        // TODO: Aynı raporu bir IPrintable değişkeninde saklayın

        // TODO: IDisplayable üzerinde Render() metodunu çağırarak ekran sürümünü yazdırın
        Console.WriteLine("Display version:");
        // Render sonucunu buraya yazdırın

        // TODO: IPrintable üzerinde Render() metodunu çağırarak yazdırma sürümünü yazdırın
        Console.WriteLine("Print version:");
        // Render sonucunu buraya yazdı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

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