2010-10-05 113 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