3 回答
TA貢獻1770條經驗 獲得超3個贊
接口只是契約或簽名,他們對實現一無所知。
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}這只是一個基本的例子,對這個原則的實際解釋超出了這個答案的范圍。
編輯
請注意,我們沒有對InterfaceISpeaker做任何更改??蛻舳舜a和SpeakerFactory也保持不變。這就是我們通過 編程到接口 .
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}TA貢獻1836條經驗 獲得超4個贊
它隱藏了不需要知道的東西,使對象更易于使用。 它提供了對象將如何運行的契約,因此您可以依賴于此。
- 3 回答
- 0 關注
- 817 瀏覽
添加回答
舉報
