Kos*_*Kos 4 c# types interface
假设我想表达" 一种期望实现IFoo和IBar接口的对象的方法 ".就像是:
void Method(IFoo+IBar param);
Run Code Online (Sandbox Code Playgroud)
我怎么能用C#说这个?
(是否存在语法结构?或者是一个好习惯?)
介绍一个界面:
interface IFooBar : IFoo, IBar {}
void Method(IFooBar param);
Run Code Online (Sandbox Code Playgroud)
这很糟糕,我后悔甚至想到它:-)乍一看看起来很好,但可悲的部分是默默地引入了一个不应该在这里的依赖.
IFooBar
存在的唯一原因是成为Method
界面的一部分.因此,要用作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");
// ...
}
Run Code Online (Sandbox Code Playgroud)
(或:在签名中定义一种类型并动态检查其他类型 - 如果一个是最重要的,则更可取,但更令人困惑)
工作正确,但在运行时(没有编译时检查).迫切需要一个doc(每个人都要阅读它).
也仅适用于功能参数.如果我试图在一个字段上使用它,那么代码会因为强制转换而大量膨胀.
这种情况的真实案例?例如IList<Foo>
+ INotifyCollectionChanged
.
public void someMethod<T>(T param) where T : IFoo, IBar
{...}
Run Code Online (Sandbox Code Playgroud)