2011-03-23 45 views
4

我正在尋找一個很好的和簡短的文章+如何使用接口的例子。 我對技術部分並不感興趣,但我需要設計部分。例如,如何使用接口進行編程,何時以及如何創建實現,如何使用接口爲常規開發設計模式。使用接口 - 設計模式方面

我有許多類似的類,以幾種方式重複自己。我想使用接口和抽象類來使事物更加模塊化 - 但我無法找到正確的方法。

回答

2

This book作爲設計模式的規範參考,幷包含使用接口的示例。不過,您可能想從更基本的層面入手。 Thinking in Java是讓我進入面向對象的編程的東西,雖然本書的內容應該主要是不可知的語言,但C#可能有類似的標題。您也可以搜索面向對象編程的在線教程。

編輯:偉大的書約在C#中的模式和他們的實現和使用是C# 3.0 Design Patterns

+0

+1爲GoF書 – 2011-03-23 23:58:23

+0

@pavelrappo GoF書不讀有人問什麼是接口 – dantuch 2011-03-24 01:20:35

+0

@dantuch沒有模式只是接口。大多數模式基本上使用接口所以這種分離對我來說看起來毫無意義。 – Andrey 2011-03-24 01:32:49

13

一個接口定義的合同。這是一個承諾,一個對象將以某種方式行事。在學習接口之前,你傾向於用具體的術語來思考對象。例如,假設我們有一個產品列表:

List<string> products = new List<string>() { "desktop", "laptop", "server" }; 

而且我們有打印出我們的產品的方法:

void PrintProducts(List<string> products) 
{ 
    foreach (string product in products) 
    { 
      Console.WriteLine(product); 
    } 
} 

我們的方法被連接到具體類型的列表中。它需要嗎? C#中有很多不同類型的集合:列表,數組,列表,只讀集合等等。你真正需要做的就是循環它們。一個列表有很多數組沒有的方法,但是你沒有在這裏使用它們中的任何一個。幸運的是,它們都實現了IEnumerable接口。這意味着它們都是「合同約束」以便能夠列舉。

更改像這樣的方法:

void PrintProducts(IEnumerable<string> products) 
{ 
    foreach (string product in products) 
    { 
      Console.WriteLine(product); 
    } 
} 

意味着您現在可以通過一個數組或列表,或一些獨特的容器,你自己創建。

另一個例子:假設你有數據的存儲庫:

public class DatabaseRepository 
{ 
    public void AddProduct(Product product) 
    { 
     // connect to the database 
     // add the product 
    } 
} 

而且你有一些類需要這個數據庫:

public class ProductManager 
{ 
    DatabaseRepository _repository; 

    public ProductManager(DatabaseRepository repository) 
    { 
     _repository= repository; 
    } 
} 

不幸的是,這個類是依賴於你的數據庫。如果您決定更改爲以XML文件形式存儲或存儲在某個雲鍵值存儲中,會出現什麼情況?您將不得不更改您的ProductManager,這很困難且容易出錯。假如不是,雖然我們定義的接口:

public interface IRepository { 
    void AddProduct(Product product); 
} 

改變我們ProductManager類使用這個接口來代替:

public class ProductManager 
{ 
    IRepository _repository; 

    public ProductManager(IRepository repository) 
    { 
     _repository= repository; 
    } 
} 

意味着,不管它是什麼類型的倉庫,我們知道,總會有一個方法AddProduct(產品產品)。現在,我們可以創建我們的XML庫:

public class XMLRepository : IRepository 
{ 
    public void AddProduct(Product product) 
    { 
     // write to an XML file 
    } 
} 

現在,我們可以自由在兩種存儲庫來傳遞:

ProductManager manager = new ProductManager(new DatabaseRepository()) 

ProductManager manager = new ProductManager(new XMLRepository()) 

和我們ProductManager行爲如出一轍。它完全不知道具體類型是什麼。

當你進入單元測試時,這會變得非常有用。控制反轉是您在深入瞭解接口工作方式時需要了解的內容。

+0

謝謝,這真的很有幫助,我明白這一點。我只是尋找如何在現實生活中大型項目中使用接口的例子。對於如何創建對象(當使用接口和不使用接口時)等等的準則項目的某種通用設計模式。 – Naor 2011-03-24 01:23:28

+0

實際上沒有接口的「設計模式」。接口是使事物更加靈活的語言結構。您大概可以使用所有設計模式,而無需使用接口。儘管ProductManager類的最後一個例子是您想要在大型產品上使用它的原因的一個例子。它可以讓你的每個子系統保持鬆散耦合。我剛剛轉而使用文件系統存儲中的Azure存儲。這是微不足道的,因爲使用外觀和界面,我不需要改變一堆類。 – mfanto 2011-03-24 01:53:14

+0

我明白你的意思,但仍然 - 我需要一個如何使用這些接口的「方法」。爲我每個班級創建界面似乎不合邏輯 - 對嗎?所以何時以及如何使用它們? – Naor 2011-03-24 01:58:26

1

當使用接口 的界面使人能夠從頭開始實施你的接口或實現一些其他的代碼,其原件或主要目的是從你的界面完全不同的接口。對他們來說,你的界面只是偶然的,必須添加到他們的代碼才能使用你的軟件包。缺點是界面中的每個方法都必須公開。你可能不想暴露一切。

何時使用抽象類 相比之下,抽象類提供了更多的結構。它通常定義一些默認實現,並提供一些對完整實現有用的工具。問題是,使用它的代碼必須使用你的類作爲基礎。如果其他希望使用你的包的程序員已經獨立開發了自己的類層次結構,這可能會非常不方便。在Java中,一個類只能從一個基類繼承。

或閱讀這樣的:「?這似乎不符合邏輯的每個類我已創建界面 - 右」 http://mindprod.com/jgloss/interfacevsabstract.html

1

@Naor,其看來,基於以上的評論你最好閱讀的書是HEAD FIRST; DESIGN PATTERNS - 它有一個令人難以置信的簡單方法來教授如何使用應用設計模式。我在這本書中首先閱讀了它們,它已經明確地改變了我的想法!通過閱讀本文,您將能夠閱讀更復雜的內容,例如Martin Fowler, Patterns of Enterprise Application Archtecture--我相信這些東西的使用方式非常簡單,適用於現實世界的模式應用。直接前往GoF或M. Fowler,或者更復雜的東西可能會導致你失望或使你失去時間。