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 關注
- 802 瀏覽
添加回答
舉報