2013-01-24 51 views
4

我們希望對屬於類庫一部分的類中的接口執行「部分顯式實現」。通過部分顯式實現,我的意思是隱式地實現接口的某些成員,並明確地實現相同接口的其餘成員。 請讓我們知道我們需要注意的可能的問題。.NET中接口的部分顯式實現

更具體地說,假設我們有如下定義的接口IDriverIDriver接口定義了所有驅動程序的基本功能。

interface IDriver 
{ 
    IDriverIdentity DriverIdentity { get; } 
    IDriverOperation Operation { get; } 
    IDriverUtility Utility { get; } 
} 

public class MyDriver1 : IDriver 
{ 
    // Implement the first and second member of IDriver implicitly 
    public IDriverIdentity DriverIdentity 
    { 
     get 
     { 
      // return a IDriverIdentity object that user can use to assess Identity operations... 
     } 
    } 
    public IDriverOperation Operation 
    { 
     get 
     { 
      // return a IDriverOperation object that user can use to access DriverOperation related properties and members.. 
     } 
    } 
    // Implement the last member of interface explicitly 
    IDriverUtility IDriver.Utility 
    { 
     get 
     { 
      // return a IDriverUtility object that user can use to access fundamental utility operations that is mandated for every "Driver" object... 
     } 
    } 
    public MyDriver1Utility Utility 
    { 
     get 
     { 
      // return MyDriver1Utility object that user can use to access utility operations available in this driver ... 
     } 
    } 
} 

同樣讓我們假設我們有實現DriverIdentityOperation含蓄和Utility明確MyDriver2MyDriver3等。

在我們想實現DriverIdentityOperation含蓄,使得用戶在使用不同的Driver對象有DriverIdentityOperation一致視圖所有Driver類。 但是,我們希望明確實現Utility成員,並在從驅動程序對象訪問時提供特定於該驅動程序的其他實用程序操作。

我們希望瞭解在這種情況下部分顯式實施的任何可能的副作用/後果。請讓我們知道你的意見。

在此先感謝!

+0

如果類實現接口,則'MyDriver1Utility'應該已經包含'IDriverUtility'的所有操作。你爲什麼需要兩個?如果你確實需要兩個,你不應該使用兩個屬性? – Kobi

+0

好問題。我不會考慮混合隱式/顯式實現,但我很想聽到這個問題的答案。 –

+0

從我的經驗來看,最大的一個是遵循代碼。我繼承了一個設計,它依賴於這個manouver,試圖讓你的腦袋圍繞它正在做的事情,而你對這個意圖的理解是困難的。不要因此而發瘋。 –

回答

1

當然你需要一個接口?如何抽象類(因爲我認爲在你的情況下,驅動程序更多的是「類型」而不是「行爲」)。

public abstract class Driver 
{ 
    public abstract DriverIdentity Identity { get; } 
    public abstract DriverOperation Operation { get; } 

    protected abstract DriverUtility Utility { get; } 
} 

如果您打算從一類的外部訪問「工具」,然後你可以添加「內部」訪問修飾符(但在這種情況下,你真的應該考慮剛剛宣佈其「公」爲好)。

+0

感謝您的所有意見。 – Raghavendra

+0

爲了保密的目的,我稍微改了一些名字。 IDriver接口已經很好的建立在我們的API中,我們無法改變這一點。IDriver接口定義了「驅動程序」的行爲(每個「驅動程序」必須具備的基本功能 - 就身份,操作和實用程序而言)... – Raghavendra

+0

@Raghavendra是否可以有一個'DriverBase'抽象類, 'Identity'和'Operation'是隱式實現的,'Utility' - 顯式地(有一個構造函數需要全部三個)。或者我已經完全脫離了原來的問題了? – volpav

1

也許你應該使用泛型,像

interface IDriver<TUtillity> where TUtillity : IDriverUtility 
{ 
    IDriverIdentity DriverIdentity { get; } 
    IDriverOperation Operation { get; } 
    TUtillity Utility { get; } 
} 

你也可以考慮使接口TUtillity,即把在聲明的「走出去」:interface IDriver<out TUtillity>

+0

據我可以告訴OP正在試圖隱藏*當對象被轉換爲'IDriver'時的具體實現,這就是爲什麼'Utility'是'IDriverUtility'的原因。 – James

+0

我們無法更改IDriver接口定義,因爲它在我們的API中已得到很好的建立。我們所有的驅動程序必須實現IDriver接口。 – Raghavendra

+0

我們正在研究實現IDriver的「驅動程序」類的設計。我們希望明確實現Utility,以便我們有範圍在Driver類中提供一個自定義的「Utility」,該類實現IDriverUtility,該IDriverUtility具有特定於該驅動程序的其他實用程序操作。當用戶說session.Utility時,除了IDriverUtility成員之外,該驅動程序中的所有實用程序操作都必須可用。然而,對於Operation和Identity,我們決定隱式實現,以便用戶在所有Driver對象中都有一致的視圖,而不會超出界面成員的範圍。 – Raghavendra