2011-03-23 67 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,或者更复杂的东西可能会导致你失望或使你失去时间。