我的函数f()
的参数必须实现两个不同的接口,这些接口通过继承IFoo
和IBar
彼此无关。我知道有两种不同的做法。第一种是声明一个从两者继承的空接口:
public interface IFooBar : IFoo, IBar
{
// nothing to see here
}
public int f(IFooBar arg)
{
// etc.
}
当然,这要求这些类声明自己是分别实现IFooBar
而不是IFoo
和IBar
。
第二种方法是通过约束使f()
通用:
public int f<T>(T arg) where T : IFoo, IBar
{
// etc.
}
您更喜欢哪一个?为什么?每个都有任何非明显的优点或缺点吗?
答案 0 :(得分:5)
第二种选择更灵活。通过引入一个新接口,您将强制类实现第三个接口,只有当它们具有对您的库(定义接口的地方)的引用时才能实现。
通过使用通用约束,该类只需要引用包含IFoo
和IBar
的库,而不是IFooBar
。
答案 1 :(得分:1)
通过创建超级界面提到的第一种方式是OO代码,因为它允许人们将类表示为组合接口并与之交互。
由于需要这样的表达式,为什么不通过使其成为一个超级界面并将其记录以便将来进行维护来使其正式并打结。 IMHO