假设我想表达“一种期望实现接口 IFoo 和 IBar 的对象的方法”。就像是:
void Method(IFoo+IBar param);
我怎么能用 C# 说这个?
(有语法结构吗?或者是一个好的习语?)
一次尝试
介绍一个接口:
interface IFooBar : IFoo, IBar {}
void Method(IFooBar param);
这很糟糕,我什至后悔想到它:-) 乍一看还不错,但可悲的是,它默默地引入了一个不应该存在的依赖项。
存在的唯一原因IFooBar
是成为Method
's 接口的一部分。因此,任何要用作Method
' 参数的对象类都必须知道该方法(和该接口)存在 - 否则不会出现这种情况。所有实现 IFoo 和 IBar 的类都需要修改为也实现 IFooBar (可能要了解一个新的程序集)——如果我们不能修改它们,这是非常不切实际的,甚至是不可能的。
不必要的依赖 = 不行。
一种解决方法
放弃静态类型:
void Method(object param)
{
if (!param is IFoo)
throw new ArgumentException("IFoo not supported", "param");
if (!param is IBar)
throw new ArgumentException("IBar not supported", "param");
// ...
}
(或者:在签名中定义一种类型并动态检查其他类型 - 如果一种是最重要的,但更令人困惑)
工作正常,但在运行时(无编译时检查)。迫切需要一个文档(每个人都可以阅读它)。
也只在函数参数中实用。如果我尝试在现场使用它,代码会因演员阵容而变得臃肿不堪。
这种情况的真实案例?例如IList<Foo>
+ INotifyCollectionChanged
。