【发布时间】:2011-02-14 21:42:23
【问题描述】:
类似于this Java question。我想指定一个变量实现多个接口。比如
private {IFirstInterface, ISecondInterface} _foo;
public void SetFoo({IFirstInterface, ISecondInterface} value)
{
_foo = value;
}
要求:
- 我无法将接口添加到将传递给 Foo 的大多数类型。所以我无法创建继承自 IFirstInterface 和 ISecondInterface 的第三个接口。
- 如果可能,我希望避免将包含的类设为泛型,因为 Foo 的类型与类没有太大关系,而且用户在编译时不太可能知道它。
- 稍后我需要使用 foo 来访问这两个接口中的方法。
- 我想以编译器安全的方式执行此操作,即在尝试使用接口之前不要尝试强制转换为接口。如果 foo 没有实现这两个接口,那么相当多的功能将无法正常工作。
这可能吗?
编辑:出于各种原因,我多次想要这个。在这种情况下,这是因为我将一组属性从 ObservableCollections 更改为 ReadOnlyObservableCollections。我有一个帮助类,它创建从源 ObservableCollection 到另一个集合的投影。由于 ReadOnlyObservableCollection 不继承自 ObservableCollection 并且我只需要 IList 和 INotifyCollectionChanged 中的操作,我希望将我的源集合存储为这两个接口的组合,而不是需要 ObservableCollection。
【问题讨论】:
-
简短回答:不。并非没有定义从 IFirstInterface 和 ISecondInterface 继承的第三个接口。
-
我唯一的想法是你可以有相同的实例作为两个接口变量?你在什么情况下需要这个?您能否提供一些关于您在哪里需要这样的东西的见解?
-
所以我不反对创建一个简单的类来处理这个问题。
-
@drachenstern 类已经存在。假设这两个接口是 IList 和 INotifyCollectionChanged。用户可以提供 ObservableCollection、ReadOnlyObservableCollection、CompositeCollection、FreezableCollection 或 ObservableDictionary。除了 ObservableDictionary 之外,这些都内置在 .Net 中。我也有很多我想要的实例,其中一个接口是 ISerializable。
-
@Bryan Anderson - 是的,但如果它是一个适当的类,那么它会同时获得它们,你不必做时髦的语义或演员,对吧?我想如果它使代码更简单,它会起作用,但我只是认为它有点难以阅读。 YMMV。