亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

“編程到接口,而不是實現”意味著什么?

“編程到接口,而不是實現”意味著什么?

互換的青春 2019-07-03 15:45:48
“編程到接口,而不是實現”意味著什么?在閱讀有關設計模式的文章時,人們會無意中發現這個短語。但我不明白,有人能給我解釋一下嗎?
查看完整描述

3 回答

?
德瑪西亞99

TA貢獻1770條經驗 獲得超3個贊


接口只是契約或簽名,他們對實現一無所知。

針對接口進行編碼意味著,客戶端代碼始終保存一個由工廠提供的Interface對象。工廠返回的任何實例都是任何工廠候選類必須實現的接口類型。這樣,客戶端程序就不會擔心實現,而接口簽名決定了所有操作都可以完成。這可以用于在運行時更改程序的行為。它還可以幫助您從維護的角度編寫更好的程序。

下面是一個基本的例子。

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}


這只是一個基本的例子,對這個原則的實際解釋超出了這個答案的范圍。

編輯

我已經更新了上面的例子,并添加了一個抽象的揚聲器基類。在這個更新中,我添加了一個功能到所有的斯皮克,以“打個招呼”。所有發言者都說“你好世界”。因此,這是一個具有類似功能的共同特性。參考類圖,您會發現Speer抽象類實現了ISpeaker接口,并將Talk()標記為抽象,這意味著每個揚聲器實現都負責實現Talk方法,因為它因說話人而異。但所有發言者都一致表示“你好”。因此,在抽象的揚聲器類中,我們定義了一個方法,該方法表示“HelloWorld”,每個揚聲器實現都將派生出SayHello方法。

考慮一種情況,在這種情況下,西班牙語發言人不能說你好,所以在這種情況下,您可以覆蓋對西班牙語發言人的SayHello方法,并提出適當的例外。

請注意,我們沒有對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}



查看完整回答
反對 回復 2019-07-03
?
HUH函數

TA貢獻1836條經驗 獲得超4個贊

將接口看作對象與其客戶端之間的契約。即接口指定對象可以做的事情,以及訪問這些事情的簽名。

實現是實際的行為。例如,您有一個方法sort()。您可以實現快速排序或MergeSort。這對于調用排序的客戶端代碼來說并不重要,只要接口不改變。

像JavaAPI和.NET Framework這樣的庫大量使用接口,因為數百萬程序員使用所提供的對象。這些庫的創建者必須非常小心,不要將接口更改為這些庫中的類,因為它會影響所有使用庫的程序員。另一方面,他們可以任意更改實現。

如果作為程序員,您可以針對實現進行代碼編寫,那么一旦它更改,您的代碼就會停止工作。因此,以這種方式考慮界面的好處:

  1. 它隱藏了不需要知道的東西,使對象更易于使用。
  2. 它提供了對象將如何運行的契約,因此您可以依賴于此。


查看完整回答
反對 回復 2019-07-03
  • 3 回答
  • 0 關注
  • 802 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號