在接口中定义类实现

时间:2010-10-05 12:58:52

标签: c# interface

您是否能够在界面中定义类实现?

例如(伪代码警报!)......

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; }
    }
}

6 个答案:

答案 0 :(得分:4)

界面的目的是定义合同,它与任何实施分开。

您可以使用界面来定义属性,如下所示:

interface IClass1
{
    String S { get; set; }

    Class2 SubClass { get; set; }
}

答案 1 :(得分:3)

没有。此外,Class2不是子类,它是嵌套类或内部类。 “子类”(在此上下文中,还有其他完全不同的上下文)派生类的另一个名称,在该上下文中,基类称为“超类”(这就是Java具有关键字的原因{ {1}}类似于C#中的super,但有一些差异)。 “衍生”和“基础”是C#中比较流行的术语,也许是因为它们在C ++中更受欢迎,也许是因为Bjarne Stroustrup说他发现它们令人困惑甚至他混淆了哪个(毕竟,子类)有一个行为的超集,反之亦然。)

内部类本质上是使用它们的包含类作为名称空间而不是其他内容,而接口只是详细说明成员方法和属性。

答案 2 :(得分:2)

没有强制类实现另一个嵌套类的语法。您在此处有效定义的是,任何IClass1实现都必须具有Class2类型的字段。

不幸的是,这有两个问题:

  1. Class2未解析为已知的可访问类型,因此将生成编译器错误。
  2. SubClass IClass1成员被声明为字段,接口无法声明字段。

答案 3 :(得分:2)

道歉,如果我误解了,但是,我现在就这样做了(VB 2013 for .NET 4.0& 4.5)。接口可以定义属性,属性可以很复杂,其中的类定义可以嵌套在接口定义中。在实现接口的类中,您只能将复杂对象的getter / setter作为一个整体,而不是它的各个属性。 (这些的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; }
    }
}

答案 4 :(得分:1)

首先,你的问题是: “你能在界面中定义类实现吗?”

答案是“某种方式/不是” 如果这就是你的意思,你不能在接口定义中包含类定义“inside”
如前所述,这种事情的实现可能通过接口属性发生。

除非存在实现代码的功能完全依赖于类并且接口已经深度集成到多个现有模块中的类,否则您可能不应该尝试实现所描述的接口结构。其中的自我是一个设计缺陷,可以与抽象类实现交换 CLR不支持多继承,但它允许类型除了继承基类之外还实现一个或多个接口。因此,接口通常用于实现多重继承的效果。

在大多数情况下,要求类从单个基类继承会使类层次结构太不灵活。要在内部使用基类来简化库开发,公共成员应该将工作委托给基类而不是从基类继承。 在设计抽象时仔细选择抽象类和接口,因为它可以像接口那样可以定义成员,可以提供实现细节但是< strong>不要求,并且可以根据需要添加成员以支持其他功能......

所以,如果按照你想要的方式使用它,它就会偏离C#接口的概念,但在实践中似乎更接近于模仿C ++等语言的多继承模型,因为它隐含地“强制你的所有实现者”接口,用于创建接口为其指定属性的每个类的实例。

您需要考虑一下想要创建这样一个结构的原因(需要强制接口的所有实现者也创建接口定义为属性的类的实例)。
这更可能是一个设计 - 代码中的错误,而不是缺少的语言功能。

所以即使这是一种可行的解决方法,我也不会称之为设计方面的好方法......

答案 5 :(得分:0)

我无法发表评论,但该问题的公认答案不再准确。 从C#8开始,可以为接口方法定义默认实现。 由于接口没有私有成员,因此仅限于调用其他公共成员,因此对于定义相互调用的方法重写很有用。