2010-02-25 43 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