【问题标题】:method parameter with multiple interface restrictions具有多个接口限制的方法参数
【发布时间】:2010-09-08 00:31:01
【问题描述】:

在 C# 中,可以定义具有两个接口限制的方法参数。这是有界的。例如。

interface IA
{
  int A {get;}
}
interface IB
{
  int B {get;}
}
void Foo<T>(T param1) where T: IA, IB    {}

所以两个接口,方法Foo的第一个参数(param1)应该实现这两个接口。

但这真的有用吗? AFAIK 不可能在 C# 中将对象强制转换为多个接口?当然一个类可以实现两个接口。

【问题讨论】:

标签: c# generics parameters interface


【解决方案1】:

有时您的通用逻辑需要同时使用多种类型的功能。例如,我曾经不得不对来自 ASP.NET 的 ButtonLinkButtonImageButton 控件执行相同的逻辑。它们各自分别派生自WebControl并实现IButtonControl接口;没有将它们联合起来的基类。

我需要将处理程序连接到IButtonControl 公开的Click 事件,并通过Attributes 集合设置客户端点击处理程序,该集合由WebControl 公开。要启用一种两者兼而有之的方法,我唯一的选择是多种类型约束:

private T CreateButton<T>() where T : WebControl, IButtonControl, new()
{
    var button = new T();

    button.Click += ...;

    button.Attributes["onClick"] = ...;

    return button;
}

【讨论】:

    【解决方案2】:

    您当然可以一次将其分配给一个:

    IA asIA = param1;
    IB asIB = param1;
    

    此外,即使没有这些行,您也可以使用它(假设它们分别采用 IA 或 IB 参数)

    IAFunc(param1);
    IBFunc(param1);
    

    【讨论】:

    • @Keith,我不关注。首先,Foo 是一种方法而不是一种类型,所以“is a Foo”没有意义。其次,IAFuncIBFunc 都不必知道 param1 也是 IB 或 IA(分别)。他们可以将其视为其名称中类型的常规实例。
    • 算了。我明白你想说你可以做的是在 Foo 作为一种方法的上下文中。
    【解决方案3】:

    如果模板化类需要来自多个接口的功能,这将非常有用。例如,您可能需要类相互比较IComparable,并且您还想确保您的模板类的用户记得覆盖ToString(),以便可以显示数据IFormattable

    这有点做作的答案,但能够多次指定精确的接口允许您将功能保留在其接口中而不会弄乱。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多