2010-10-05 116 views
5

您能夠在接口中定義類實現嗎?定義接口中的類實現

例如(僞代碼警報!)...

interface IClass1 
{ 
    String s { get; set; } 

    // classes implementing this interface has to implement Class2 as "SubClass" 
    Class2 SubClass; 
} 

interface IClass2 
{ 
    Int32 i { get; set; } 
} 

class Class1 : IClass1 
{ 
    String IClass1.s { get; set; } 

    class IClass1.Class2 SubClass 
    { 
     Int32 IClass2.i { get; set; } 
    } 
} 

回答

4

接口的目的是定義合同一個其是從任何實施分開。

你可以用一個接口做的是定義一個財產像這樣:

interface IClass1 
{ 
    String S { get; set; } 

    Class2 SubClass { get; set; } 
} 
+0

@roosteronacid:這是您的首選答案? – cseder 2014-02-04 22:29:36

3

號此外,Class2中不是一個子類,它是一個嵌套類或內部類。 「子類」是(在這種情況下,有其他上下文完全不同)另一個派生類的名稱,在該上下文中,基類稱爲「超級類」(這就是爲什麼Java有關鍵字super這與C#中的base類似,儘管存在一些差異)。 「派生」和「基礎」是C#中比較流行的術語,也許是因爲它們在C++中更受歡迎,也許是因爲Bjarne Stroustrup說他發現它們令人困惑,甚至混淆了哪個是哪個(畢竟是子類具有行爲的超集,反之亦然)。

內部類實質上是使用它們的包含類作爲命名空間而沒有別的,而接口只是詳細說明了成員方法和屬性。

2

沒有強制類實現另一個嵌套類的語法。您在此有效定義的是,任何IClass1實現必須具有類型Class2的字段。

不幸的是兩件事情不對的:

  1. Class2沒有解決一個已知訪問類型,因此將產生一個編譯器錯誤。
  2. IClass1的​​成員被聲明爲字段,並且接口無法聲明字段。
1

首先,你的問題是: 「你能夠在一個界面來定義類的實現? 「

對此的答案是「以某種方式/否」
如果這就是你的意思,你不能包含類定義「inside」接口定義。

如前所述,這種事情的實現可能通過接口屬性發生。

除非存在實現代碼的功能完全依賴的類,並且接口已經深深地集成到幾個現有模塊中,否則您應該不嘗試實現所描述的接口結構。這在它自身是一個設計缺陷,可以與抽象類實現交換。
CLR不支持多重繼承,但它確實允許類型除了從基類繼承之外還實現一個或多個接口。因此,接口通常用於實現多重繼承的效果。

要求類從單個基類繼承將在大多數情況下使類層次結構太不靈活。要在內部使用基類來簡化庫開發,公共成員應該將工作委託給基類,而不是從基類繼承。 仔細選擇一個抽象類,設計了一個抽象的時候,因爲它可以表現得像它可以定義成員的接口的接口之間,它可以提供實施細節,但被這樣做不是必需的,可以需要以支持額外的功能添加會員...

所以,如果你想要的方式使用,它的C#接口的概念出發,但也許似乎更接近模仿的語言,如多重繼承模型C++在實踐中,因爲它隱式地「強制你的接口的所有實現者創建接口已經指定的每個類的實例d屬性。

您需要考慮一些想要創建這種結構的原因(需要強制所有接口的實現者也創建接口定義爲屬性的類的實例)。
這很可能是代碼中的設計缺陷,而不是缺少語言功能。

所以,即使它是一個可能的解決方法,我不會把它的設計東西的好辦法...

2

道歉,如果我誤解了,但是,是的,我現在做這個(VB 2013 .NET 4.0 & 4.5)。接口可以定義屬性,屬性可以是複雜的,它的類定義可以嵌套在接口定義中。在實現接口的類中,您只能爲複雜對象整體獲取getter/setter,而不是其各個屬性。 (這些獲得者/設置者當然在類定義之內)。從VB連接的工作示例,以及未經測試的轉換到C#。

VB:

Interface IPrintable 
    Property Body As DocBody 

    Class DocBody 
     Property Text As String 
     Property FontSize As Single 
    End Class 
End Interface 

Class WordDoc 
    Implements IPrintable 
    Public Property WordBody As IPrintable.DocBody Implements IPrintable.Body 
End Class 

和C#:

interface IPrintable 
{ 
    DocBody Body { get; set; } 
    public class DocBody 
    { 
     public string Text { get; set; } 
     public float FontSize { get; set; } 
    } 
} 

class WordDoc : IPrintable 
{ 
    public IPrintable.DocBody WordBody { get; set; } 
    IPrintable.DocBody IPrintable.Body { 
     get { return WordBody; } 
     set { WordBody = value; } 
    } 
} 
+0

僅供參考 - C#版本不會編譯。 C#不允許接口中的類。 – 2017-09-12 03:09:20