【问题标题】:C#: Preferred pattern for functions requiring arguments that implement two interfaces [closed]C#:需要实现两个接口的参数的函数的首选模式[关闭]
【发布时间】:2010-04-12 16:54:49
【问题描述】:

我的函数f() 的参数必须实现两个不同的接口,它们之间没有继承关系,IFooIBar。我知道两种不同的方法。首先是声明一个继承自两者的空接口:

public interface IFooBar : IFoo, IBar
{
    // nothing to see here
}

public int f(IFooBar arg)
{
    // etc.
}

这当然要求类声明自己实现IFooBar 而不是分别实现IFooIBar

第二种方法是使用约束使f() 泛型:

public int f<T>(T arg) where T : IFoo, IBar
{
    // etc.
}

您更喜欢其中哪一个,为什么?各自有什么不明显的优点或缺点吗?

【问题讨论】:

  • Second 更短,更具表现力。
  • 我建议使用通用方法。它使实现对象不必知道它的两个接口是一起使用的。

标签: c# interface generics


【解决方案1】:

第二个选项更灵活。通过引入新接口,您将强制类实现第三个接口,这只有在它们具有对您的库(定义接口的位置)的引用时才有可能。

通过使用泛型约束,该类只需要引用包含IFooIBar 的库,而不需要IFooBar

【讨论】:

  • 另外,创建一个接口,在野外释放它,再也不要碰它比泛型方法更难完成......
  • 也适用于通用接口。 f&lt;TCollection, TElement&gt;(TCollection collection) where TCollection : ICollection&lt;TElement&gt;, INotifyCollectionChanged
【解决方案2】:

您提到的创建超级接口的第一种方式吸引了 OO 代码,因为它允许将一个类表示为 组合 接口并与之交互。

既然需要这样的表达,为什么不把它正式化,打结,把它变成一个超级接口,并把它记录以备将来可能的维护。恕我直言

【讨论】:

  • 此外,如果您有多个方法需要组合接口,则声明一次组合接口比多次重申泛型约束更简洁。
猜你喜欢
  • 1970-01-01
  • 2018-05-12
  • 2022-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
相关资源
最近更新 更多