我正在寻找一个良好的和如何与接口工作简短的article+examples。我对技术部分不感兴趣,但我需要设计部分。例如,如何使用接口编程,何时以及如何创建实现,使用接口进行常规开发的设计模式。
我有许多类似的类,它们以几种方式重复自己。我想使用接口和抽象类来使事情变得更加模块化--但我不知道如何正确地做到这一点。
发布于 2011-03-24 09:11:56
接口定义了一个约定。这是一个承诺,一个对象将以某种方式运行。在学习接口之前,您往往会以具体的术语来考虑对象。例如,假设我们有一个产品列表:
List<string> products = new List<string>() { "desktop", "laptop", "server" };我们有一种打印产品的方法:
void PrintProducts(List<string> products)
{
foreach (string product in products)
{
Console.WriteLine(product);
}
}我们的方法与列表的具体类型相耦合。有必要这样做吗?C#中有很多不同类型的集合:列表、数组、ReadOnlyCollection等等,你真正需要做的就是遍历它们。list有很多数组没有的方法,但是这里没有使用任何方法。幸运的是,它们都实现了接口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的行为也完全一样。它完全不知道具体的类型是什么。
当您进入单元测试时,这将变得非常有用。当你对接口的工作原理有了深刻的理解后,你就会想要读到控制反转这个东西了。
发布于 2011-03-24 07:50:47
This book是设计模式的规范参考,并包含使用接口的示例。但是,您可能希望从更基本的层次开始。Thinking in Java让我开始了面向对象编程,虽然这本书的内容大部分应该是语言不可知的,但C#可能有类似的标题。您还可以搜索有关面向对象编程的在线教程。
编辑:C# 3.0 Design Patterns是一本关于模式及其在C#中的实现和用法的好书
发布于 2011-03-24 09:26:29
什么时候使用接口接口允许别人从头开始实现你的接口,或者用其他一些代码实现你的接口,这些代码的原始或主要目的与你的接口有很大不同。对他们来说,你的界面只是附带的,必须添加到他们的代码中才能使用你的包。缺点是接口中的每个方法都必须是公共的。您可能不想公开所有内容。
何时使用抽象类抽象类提供了更多的结构。它通常定义一些默认实现,并提供一些对完整实现有用的工具。问题是,使用它的代码必须使用您的类作为基类。如果其他想要使用您的包的程序员已经独立地开发了他们自己的类层次结构,那么这可能非常不方便。在Java中,一个类只能从一个基类继承。
或者阅读以下内容:http://mindprod.com/jgloss/interfacevsabstract.html
https://stackoverflow.com/questions/5413043
复制相似问题