可以将接口附加到已定义的类

时间:2014-03-25 12:48:10

标签: c# interface

情况如下。在某些情况下,我发现自己想要一个课程,我们称之为class C,它具有与class A相同的功能,但添加了interface B。现在我这样做:

class C : A,B
{
   //code that implements interface B, and nothing else
}

如果class A恰好被封存,问题就会出现。有没有办法让class A 实施 interface B而无需定义class C(使用扩展方法或其他内容)

4 个答案:

答案 0 :(得分:8)

基本上:不。这是“mixins”可以带来的一部分,但C#语言目前还不支持(已经讨论了几次,IIRC)。

您必须使用当前的方法,或者(更常见的)只是封装 A的传递装饰器,而不是继承 {{1 }}

A

答案 1 :(得分:3)

我看到的唯一方法是将继承更改为聚合,如下所示:

class C : B
{
    public C(A instanceToWrap)
    {
        this.innerA = instanceToWrap;
    }

    //coda that implements B

    private A innerA;
}

似乎有可能在运行时注入接口,就像使用Array类和IEnumerable<T>接口一样,但它似乎有点过分。

答案 2 :(得分:2)

  

有没有办法让A类实现接口B而不必定义C类(带扩展方法或其他东西)

简短回答是否。您无法使A 实施 B,因为您没有控制< {em} of A。但是,我认为你是通过扩展方法走向正确的道路。考虑一下:

public static class AImplementsBExtensions
{
    public static void Func1(this A o) { }
    public static void Func2(this A o) { }
}

现在显然我不知道B上存在哪些方法,但是如果您无法继承B,就可以在A上实现var a = new A(); a.Func1();

请记住,这是 不是实现。 如果您在界面中添加或删除方法,则必须在此处手动执行此操作。但现在你可以这样做:

{{1}}

答案 3 :(得分:0)

您可以尝试创建没有继承的类:class C : B以及A的包装。

此外,您可以提供隐式转换运算符,以便像A obj = new C(new A())这样的代码与派生类的工作方式类似。

class C : B
{
    private A _inner;
    public C(A inner)
    {
        this._inner = inner;
    }

    public A Inner { get { return this._inner; } }

    public static implicit operator A(C obj)
    {
        return obj == null ? (A)null : obj._inner;
    }

    public static implicit operator C(A obj)
    {
        return new C(obj);
    }
}