情况如下。在某些情况下,我发现自己想要一个课程,我们称之为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
(使用扩展方法或其他内容)
答案 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);
}
}