2010-02-25 106 views
2

我有一个数据提供程序项目来访问数据库。这是由各种类组成(PersonDataProvider,JobDataProvider ...) 我想创建一个接口。 我是否需要为每个班级创建一个界面? 我很想创建一个接口,而不是继承所有的类。这涉及到使所有的项目类都是部分的,并改变类的名称.......但我认为不是最好的解决方案。 有什么建议吗?C#多类的接口

+0

你能举一个你的界面和类会是什么样子的例子吗?目前我不知道你提出的解决方案是什么,所以我忍不住批评它。谢谢 – 2010-02-25 16:54:39

+0

它不一定是一个有合同的界面。你也可以使用抽象类。抽象类的优点是维护起来更容易。您可以添加到它而不更改继承它的类。如果你添加了一些接口,那么所有这些类都需要实现它。 既然你没有代码样本很难分辨哪个更适合。 – nickytonline 2010-02-25 17:06:40

回答

5

你不会继承你实现它的接口。没有必要为了添加接口而不需要创建类。

一个接口是一个契约,该类订阅说它将遵守接口中描述的方法,并将适当地实现它们。对于你的场景,你需要创建一个接口并在你的类中实现它,然后你可以将各种访问器类的实例作为接口的实例。

例如:

public interface IDataProvider 
{ 
    void LoadData(); 
} 

数据提供者,然后将如下所示:

public class MyDataProvder1 : IDataProvider 
{ 
    // Some methods 

    // Must implement LoadData 
    public void LoadData() 
    { 
     // Do something 
    } 
} 

public class MyDataProvder2 : IDataProvider 
{ 
    // Some methods 

    // Must implement LoadData 
    public void LoadData() 
    { 
     // Do something 
    } 
} 

然后,您可以通过对象作为IDataProvider如下:

IDataProvider DataProviderA = new MyDataProvider1(); 
IDataProvider DataProviderB = new MyDataProvider2(); 

// Call function that expects an IDataProvider 

DoSomething(DataProviderA); 
DoSomething(DataProviderB); 

.. 。

public void DoSomething(IDataProvider DataProvider) 
{ 
    DataProvider.LoadData(); 
} 

希望能为您解决这个问题。

+0

在我看来,用你的方法,所有的类都必须实现所有的方法....我不想要它。我想定义界面中的所有方法,但允许每个类实现与其目的相关的方法。检索人员数据,作业数据... – GigaPr 2010-02-25 17:08:13

+0

示例中的LoadData方法可以在每个类中执行不同的操作。为了返回不同的数据类型,我认为你需要使用泛型,有些东西可以用来阅读,你会很高兴你做到了。 – Lazarus 2010-02-25 17:15:21

+0

是的,但您的解决方案仅适用于没有任何参数的方法。 其他每种方法都会实现不需要的方法。 – GigaPr 2010-02-25 18:49:29

0

使用接口取决于您想要如何排列类。接口允许某种即插即用的行为。所以,如果你需要一个单独的界面,这意味着你将在所有实现该界面的类中有一组接口。在这种情况下,您的类PersonDataProvider,JobDataProvider等将具有相同的一组方法。如果你觉得,他们需要不同,仍然可以通过一个单一的供应商的门面,你可以考虑使用门面模式。

外观将为单个提供者提供接口,提供者类将实现它们。

4

我认为你正在接近这个错误。

当你创建一个接口时,你正在为这些类创建一个合约。把它想象成“我的班级将作为 IMyInterface”。

如果您的所有类都有一个常见的使用场景,那么可以使用单个通用接口(IDataProvider,给定类名称..?)。

+0

我的每个班级负责从数据库中检索某种“类型”的数据。例如PersonDataProvider将检索JobDataProvider作业详细信息等人的详细信息。 你是什么意思的常见使用情况? 所有用于检索应用程序的数据...是这种常见的情况? – GigaPr 2010-02-25 16:59:29

+3

您可以使用IDataProvider ,其中T是工作,人,等... – 2010-02-25 17:03:43

0

首先,我假设在所有xDataProvider类中都有标准方法调用。例如,而不是SelectPerson方法,您在PersonDataProvider类上有Select方法。如果不是的话,你需要做一些工作才能做出有效的练习。

在Visual Studio中,有一个抽取接口重构选项。在xDataProvider类中右键单击并选择重构 - 抽取接口。现在命名它(例如IDataProvider),并在界面中选择你想要的方法/属性,点击确定,完成这个类。

然后,只需在其他xDataProvider类中实现此IDataProvider接口。假设您已经在所有DataProvider类中实现了类似的方法,则不必再编写任何代码(超出: IDataProvider)。

+0

我看到你的观点,但如果让我们考虑以下情形 类1 公众人物获取(INT ID){} Class2中 公开招聘获取(INT ID,日期为准) CLASS3 公共地址获取(INT ID,srting邮编) 所有类implementin IDataProvider将必须实现不需要 难道不是它的方法呢? – GigaPr 2010-02-25 18:47:51

+0

我会说你会在'IDataProvider'接口中有一个标准的'Get(int id)'方法。 – 2010-02-25 18:59:24