是否有任何类型安全的、编译时检查的引用实现多个接口(interface)的值的可能性?
给定
interface A {
void DoA();
}
interface B {
void DoB();
}
我能够为实现 A
的对象编写代码或 B
,但不是两者。所以我必须想出丑陋的 wrapper :
class ABCollection {
private class ABWrapper : A, B {
private readonly A a;
private readonly B b;
public static ABWrapper Create<T>(T x) where T : A, B {
return new ABWrapper { a = x, b = x };
}
public void DoA() {
a.DoA();
}
public void DoB() {
b.DoB();
}
}
private List<ABWrapper> data = new List<ABWrapper>();
public void Add<T>(T val) where T : A, B {
data.Add(ABWrapper.Create(val));
}
}
是否有技巧可以更直观地编写此代码而不会失去类型安全性(运行时强制转换等)?
例如
private List<A and B> ...
编辑:这不是特别要有一个列表——我只是想给出一个“完整”的例子来说明存储这些值的问题。我的问题只是如何键入两个接口(interface)的组合(例如 A & B
或 A and B
)。
另一个更有用的例子:List<IDrawable & IMovable>
...
最佳答案
您可以像在 C# 中那样执行参数多态性,但不能子类型多态性。也就是说,您可以创建一个多态方法,例如:
void Foo<T>(T t) where T : IFoo, IBar
{
t.Foo();
t.Bar();
}
然后您必须传递一个类型在编译时已知的对象以同时实现 IFoo 和 IBar。
但是没办法说
void Foo(IFoo-and-IBar t)
{
t.Foo();
t.Bar();
}
然后传入一个既是 IFoo 又是 IBar 的值。不错的功能,但我们不支持。
关于c# - 在 C# 中使用多个接口(interface)键入多态值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1882234/