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

  显示原文与译文双语对照的内容
0 0

情况是这样 在某些情况下我发现我想要的类,我们将其称为 class C具有相同的功能 class A,但除此以外,它有 interface B实现。 对于现在我就可以这样做:

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

我们将会问题如果 class A刚好是sealed 。 是否有一种方法我可以让 class A实现interface B而无需定义 class C( 跟扩展方法还是什么)

时间:原作者:6个回答

0 0

基本上就是: no 。 属于什么" mixins " 可以把到表中,但C# languauge当前不支持的( 它已几次讨论,iirc ) 。

你将必须使用目前这种方法,或( 更常见) 是一个通过decorator,封装A而不是继承A.

class C : IB
{
    private readonly A a;
    public C(A a) {
        if(a == null) throw new ArgumentNullException("a");
        this.a = a;
    }
    // methods of IB:
    public int Foo() { return a.SomeMethod(); }
    void IB.Bar() { a.SomeOtherMethod(); }
}
原作者:
0 0

我知道的唯一方法就是将继承关系改为聚合,如下所示:

class C : B
{
    public C(A instanceToWrap)
    {
        this.innerA = instanceToWrap;
    }
    //coda that implements B
    private A innerA;
}

似乎有可能在运行时,因为它是用完成注入接口Arrayclass和 IEnumerable<T>接口,但是看起来一点不夸张。

原作者:
0 0

是否有一种方法我就可以把类A B,而不必定义实现 接口与扩展方法类C ( 或其它设备)

简单来说就是 no 。 你不能阻止 A实现B因为你没有 控件的A. 但是,我觉得你是在走下坡路的这条路扩展方法。 设想一下:

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

现在很明显存在我不知道的方法 B,但这是如何实现 BA当你不能从该类继承。

请记住,这是无法实现。 如果界面上的添加或移除方法,你将用手工这么麻烦来了 但是现在你可以这样做:

var a = new A();
a.Func1();
原作者:
0 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);
    }
}
原作者:
...