簡體   English   中英

使用Interface有什么好處?

[英]What is the advantage of using Interface?

使用Interface有什么用?

我聽說它被用來代替多重繼承,數據隱藏也可以用它來完成。

是否還有其他優點,使用places接口的位置,以及程序員如何識別需要的接口?

explicit interface implementationimplicit interface implementation什么區別?

為了解決隱式/顯式問題,讓我們說兩個不同的接口具有相同的聲明:

interface IBiographicalData

    {
       string LastName
       {
          get;
          set;
       }

    }

    interface ICustomReportData
    {
       string LastName
       {
          get;
          set;
       }
    }

你有一個實現兩個接口的類:

class Person : IBiographicalData, ICustomReportData
{
    private string lastName;

    public string LastName
    {
        get { return lastName; }
        set { lastName = value; }
    }
}

類Person 隱式實現兩個接口,因為您使用以下代碼獲得相同的輸出:

Person p = new p();
IBiographicalData iBio = (IBiographicalData)p;
ICustomReportData iCr = (ICustomReportData)p;

Console.WriteLine(p.LastName);
Console.WriteLine(iBio.LastName);
Console.WriteLine(iCr.LastName);

但是,要顯式實現,您可以像這樣修改Person類:

class Person : IBiographicalData, ICustomReportData
{
    private string lastName;

    public string LastName
    {
        get { return lastName; }
        set { lastName = value; }
    }

    public string ICustomReportData.LastName
    {
        get { return "Last Name:" + lastName; }
        set { lastName = value; }
    }
}

現在的代碼:

Console.WriteLine(iCr.LastName);

將以“姓氏:”為前綴。

http://blogs.msdn.com/b/mhop/archive/2006/12/12/implicit-and-explicit-interface-implementations.aspx

接口非常有用

  • 依賴注入
  • 控制反轉
  • 測試隔離

接口只是簡單地將類API的描述與其實現分開。 它是關於關注點的分離,這是任何強大的軟件項目的基礎。 您可以在不破壞任何其他代碼的情況下替換實現類。

這一點特別有用的一個方面是單元測試,因為它允許您模擬出您不想作為給定測試用例的一部分進行測試的接口。

具有完全不相關的類實現相同的接口還允許您編寫可以在不同層次結構中的不同類上操作的方法(即除了對象之外沒有共同的祖先),而不必將對象作為其類型。 例如,您可以編寫一個采用IEnumerable的方法,並將其傳遞給List,Array等。如果沒有接口或公共基類型,則無法實現(除非通過從對象轉換)。

從最基本的術語來看,我們回到OOP 101:

繼承:對象B“是對象A的類型。對象A實現的行為和方法是對象B的繼承,實現和所有(有一些覆蓋空間)。

接口:對象A和對象B都是由“公共接口”表示的抽象對象的“Act Like”示例。 James Gaunt使用了上面的Ienumerable示例。 其他示例可能是IPrintable,IDisposable等。

對於任何實現這些接口的給定類,實現都可能完全不同(想想你如何在使用dispose方法的不同類中實現IDisposable)。 但是,客戶端代碼不需要知道或關心實際對象的類型 - 代碼可以通過接口簡單地訪問所需的屬性和方法。

繼承通常被視為許多編碼問題的“神奇”答案,但也被廣泛誤用作避免編寫更多代碼的手段。 我不同意user492238,使用Interfaces完成的事情可以通過繼承輕松完成。 這種方法通常會讓你陷入困境。 並且,正如Jodrell所觀察到的,多重繼承不是.net的特征(在我看來這是正確的)。

當您發現自己在幾個(或許多)其他不相關的類中實現相同的行為時,請考慮定義一個為該行為提供API的接口。 您可能有幾個類:Person,Animal,Building等。所有這些類都可能需要一種方法來提供可打印的輸出。 您可能還有一個接受IPrintableObject作為參數的方法。 在這種情況下,您可以在需要打印的任何類中實現IPrintableObject,在每個對象中提供實現代碼,並將它們提供給客戶端代碼。

對於經驗豐富的程序員而言,這可能是一個問題,而不是答案,但是...在大多數情況下,我與小團隊合作,我們很親密,彼此了解得很好。 我想知道界面到底是什么。 但我的最后一個項目是新團隊,而且規模更大。 這是一個冬青混亂。 過了一段時間我得出結論:我們應該使用接口。

不是解決任何技術問題的方法,而是作為一種代碼中的設計文檔,它迫使您遵循這種難以忽視的設計,這將使協作變得容易100倍。 坐在一起想出界面並不是問題。 然后你可以分開並單獨實現一些東西。 但是如果你按照界面進行操作,那么團隊中的每個人都可以更清楚地閱讀課堂理念。

所以,我最好的猜測是,接口是安排合作的好方法:實現你想要的,但是接口之外沒有任何公共接口,重寫接口必須與其他人一起完成。 簡單的方法來保持代碼的順序和分離常見的東西,而你的東西只是你的東西。

大多數 - 如果不是全部 - 可以通過接口完成的事情也可以通過繼承來完成。 接口可用於使用抽象基類替換類設計。 更喜歡哪個主要是個人經驗和品味。 (當然,有些人對於什么時候更喜歡一個在另一個之上而制定了非常嚴格的規則)。

並且存在框架(通常與DI containern結合),這會強制您使用接口。

界面是合同; 它保證指定的方法和屬性可用。 它沒有提供任何實現,這使得它與提供實現的類不同。

接口是最高級別的抽象,它不向消費者提供實現細節。

接口幾乎在語義上等同於純抽象類(不提供任何實現的類)。 在c#,vb.net和其他語言中,類可以有多個接口,但只有一個基類。 因此,對於特定的優點,接口具有過類(抽象或其他),您可以實現多個接口,但只能從一個類繼承。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM