2010-03-25 66 views
2

我想找出一種方法來強制我的所有接口包含相同名稱/類型的屬性。如何強制多個接口包含相同的屬性?

例如:我有兩個接口; IGetAlarms和IGetDiagnostics。每個接口將包含特定於接口本身的屬性,但是我想強制兩個接口(以及後面可能添加的所有其他接口)包含同名的屬性。因此,結果可能看起來像這樣的:

interface IGetAlarms 
{ 
    string GetAlarms(); 
    DateTime LastRuntime { get; set; } 
} 

interface IGetDiagnostics 
{ 
    string GetDiagnostics(); 
    DateTime LastRuntime { get; set; } 
} 

注意兩個接口包括一個名爲LastRuntime一個DateTime屬性。

我想知道是否有某種方法可以強制其他接口,稍後將添加以包含DateTime LastRuntime屬性。我天真地試圖讓我所有的接口實現另一個接口(IService) - 其中包括LastRuntime屬性。但是,這並不能解決我的問題,因爲它只是迫使類實現屬性 - 而不是所有的接口。

謝謝。

回答

4

接口可以繼承其他接口。

interface IDerived : IBase 
{ 
    string Foo { get; set; } 
} 

interface IBase 
{ 
    DateTime LastRunDate { get; set; } 
} 

任何派生自IDerived的類都必須實現IBase的方法/屬性。

class Derived : IDerived 
{ 
    #region IDerived Members 

    public string Foo { get; set; } 

    #endregion 

    #region IBase Members 

    public DateTime LastRunDate {get;set;} 

    #endregion 
} 
1

如果我理解你的問題正確,要強制一個類來實現多個不同的接口,接口的名單將隨時間增長,但將有一些共同的特性。

你已經用你的IService接口解決的公共屬性部分。像這樣的事情,我猜想

interface IService 
{ 
    DateTime LastRuntime { get; set; } 
} 

interface IGetAlarms : IService 
{ 
    string GetAlarms(); 

} 

interface IGetDiagnostics : IService 
{ 
    string GetDiagnostics(); 
} 

一個類將不得不實現你的接口越來越多的列表也可以以類似的方式解決。創建一個「複合」接口,所有接口繼承你希望你的類來實現

interface IComposite : IGetAlarms, IGetDiagnostics {} 

class MyClass : IComposite 
{ 
    ... 
} 

當你讓IComposite接口繼承一個新的接口,類將執行新的界面了。

編輯

在回答您的澄清;在這種情況下,您不應該共享LastRuntim e屬性的規範,而是在每個單獨的接口中聲明它。在實現類,你可以使用Explicit interface member implementation

class MyClass : IComposite 
{ 
    DateTime IGetAlarms.LastRuntime { get; set; } 
    DateTime IGetDiagnostics.LastRuntime { get; set; } 
    ... 
} 

然而,據我所知這是不可能迫使實現類明確地實現每一個單獨接口

+0

我應該在我的第一篇文章中提到過,我希望在所有接口中實施的屬性必須針對每個接口。因此,使用我的初始示例,實現IGetAlarms和IGetDiagnostics的類將能夠爲IGetAlarms.LastRuntime和IGetDiagnostics.LastRuntime屬性存儲不同的值。我試圖在這裏解決的問題是確保所有接口都支持自己的LastRuntime實現。 在這種情況下,我無法使用抽象類,因爲我的派生類需要能夠實現多個服務。 – Jed 2010-03-25 04:25:44

+0

感謝您的意見,彼得。 – Jed 2010-03-25 17:59:32

0

這真的取決於正是你需要的接口。您可以使用泛型來強制執行指定的模式,但是如果它們都具有相同的簽名,則不能強制執行每個單獨的實現。

public interface IA<T> where T: class 
{ 
    void DoIt(T ignore = null); 
} 
public interface IB : IA<IB> 
{ 
} 
public interface IC : IA<IC> 
{ 
} 

這將迫使下面的類分別實現每個:

public class D : IB, IC 
{ 
    public void DoIt(IB ignore = null) { } 
    public void DoIt(IC ignore = null) { } 
} 

這迫使每一個單獨實施的「T忽略」參數,因爲它有一個默認值,你除非使用反射來調用它,否則可以忽略該參數。

但顯然這不適用於屬性,所以它們必須使用getter/setter方法來實現。

相關問題