SORU
23 NİSAN 2010, Cuma


&Quot;arayüzler, uygulamalar" değil program; ne anlama geliyor?

Tasarım desenleri hakkında okurken bu cümle üzerine bir film.

Ama anlamıyorum, birisi bana bunu açıklayabilir mi?

CEVAP
23 NİSAN 2010, Cuma


Arayüzleri sadece sözleşme imzalar ve bilmiyorlar uygulamaları ile ilgili bir şey.

Arayüzü anlamına gelir karşı kodlama, istemci kodu her zaman bir fabrika tarafından sağlanan Arabirim bir nesne tutar. Herhangi bir örnek fabrika tarafından döndürülen türü olacak herhangi bir fabrika aday sınıf hayata geçirdik gereken Arayüz. Bu şekilde istemci programının uygulanması konusunda herhangi bir endişe duymadığını ve arayüz imza tüm işlemler neler yapılabileceğini belirler. Bu çalışma zamanında bir program davranışını değiştirmek için kullanılabilir. Ayrıca görünüm bakım noktadan çok daha iyi bir program yazmak için size yardımcı olur.

Burada temel bir örnek.

public enum Language
{
    English, German, Spanish
}

public class SpeakerFactory
{
    public static ISpeaker CreateSpeaker(Language language)
    {
        switch (language)
        {
            case Language.English:
                return new EnglishSpeaker();
            case Language.German:
                return new GermanSpeaker();
            case Language.Spanish:
                return new SpanishSpeaker();
            default:
                throw new ApplicationException("No speaker can speak such language");
        }
    }
}

[STAThread]
static void Main()
{
    //This is your client code.
    ISpeaker speaker = SpeakerFactory.CreateSpeaker(Language.English);
    speaker.Speak();
    Console.ReadLine();
}

public interface ISpeaker
{
    void Speak();
}

public class EnglishSpeaker : ISpeaker
{
    public EnglishSpeaker() { }

    #region ISpeaker Members

    public void Speak()
    {
        Console.WriteLine("I speak English.");
    }

    #endregion
}

public class GermanSpeaker : ISpeaker
{
    public GermanSpeaker() { }

    #region ISpeaker Members

    public void Speak()
    {
        Console.WriteLine("I speak German.");
    }

    #endregion
}

public class SpanishSpeaker : ISpeaker
{
    public SpanishSpeaker() { }

    #region ISpeaker Members

    public void Speak()
    {
        Console.WriteLine("I speak Spanish.");
    }

    #endregion
}

alt text

Bu sadece temel bir örnektir ve prensip gerçek açıklaması bu cevap kapsamı dışındadır.

EDİT

Yukarıdaki örnek güncelledik ve Hoparlör soyut temel sınıf ekledi. Bu güncelleştirme, tüm Spakers için bir özellik eklendi"". SayHello Her konuşmacının konuşmasına "Merhaba Dünya". Benzer işlevi ile ortak bir özelliği var. Başvurmak için sınıf diyagramı ve bulacaksın o Hoparlör soyut sınıf uygulamak İSpeaker arayüzü ve işaretleri Konuşmak() gibi soyut anlamına gelir her Hoparlör uygulanmasından sorumlu uygulayıcı Konuşma yöntemi bu yana değişir Hoparlör için Hoparlör. Ama hoparlör "Merhaba" oybirliğiyle. Soyut Hoparlör sınıfta biz şöyle bir yöntem tanımlamak için "Merhaba" ve her Hoparlör uygulama SayHello yöntemini elde edecek. Dünya

SpanishSpeaker olamaz bu durumda İspanyolca Hoparlör için SayHello yöntemini geçersiz kılar ve düzgün bir istisna yükseltmek, böylece bir Selam bir durumda düşünün.

Var unutmayın lütfen Arayüzü herhangi bir değişiklik yapılmış İSpeaker. Ve istemci Kodu ve SpeakerFactory da etkilenmez değişmeden. Ve bunu gerçekleştiriyoruzProgramlama için Arayüz.

Ve Her uygulama böylece orijinal programı değişmeden bırakarak sadece bir temel sınıf Başkanı ve bazı küçük değişiklik soyut ekleyerek bu davranışı elde edebiliriz. Bu, herhangi bir uygulama için istenilen bir özelliktir ve uygulaması kolay bakımı sağlar.

public enum Language
{
    English, German, Spanish
}

public class SpeakerFactory
{
    public static ISpeaker CreateSpeaker(Language language)
    {
        switch (language)
        {
            case Language.English:
                return new EnglishSpeaker();
            case Language.German:
                return new GermanSpeaker();
            case Language.Spanish:
                return new SpanishSpeaker();
            default:
                throw new ApplicationException("No speaker can speak such language");
        }
    }
}

class Program
{
    [STAThread]
    static void Main()
    {
        //This is your client code.
        ISpeaker speaker = SpeakerFactory.CreateSpeaker(Language.English);
        speaker.Speak();
        Console.ReadLine();
    }
}

public interface ISpeaker
{
    void Speak();
}

public abstract class Speaker : ISpeaker
{

    #region ISpeaker Members

    public abstract void Speak();

    public virtual void SayHello()
    {
        Console.WriteLine("Hello world.");
    }

    #endregion
}

public class EnglishSpeaker : Speaker
{
    public EnglishSpeaker() { }

    #region ISpeaker Members

    public override void Speak()
    {
        this.SayHello();
        Console.WriteLine("I speak English.");
    }

    #endregion
}

public class GermanSpeaker : Speaker
{
    public GermanSpeaker() { }

    #region ISpeaker Members

    public override void Speak()
    {
        Console.WriteLine("I speak German.");
        this.SayHello();
    }

    #endregion
}

public class SpanishSpeaker : Speaker
{
    public SpanishSpeaker() { }

    #region ISpeaker Members

    public override void Speak()
    {
        Console.WriteLine("I speak Spanish.");
    }

    public override void SayHello()
    {
        throw new ApplicationException("I cannot say Hello World.");
    }

    #endregion
}

alt text

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ben Schoon

    Ben Schoon

    23 Kasım 2012
  • Benjamin Heckendorn

    Benjamin Hec

    4 Mayıs 2008
  • Need for Speed

    Need for Spe

    8 ŞUBAT 2006