代码之家  ›  专栏  ›  技术社区  ›  Julian

具有多个接口限制的方法参数

  •  2
  • Julian  · 技术社区  · 14 年前

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

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

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

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

    3 回复  |  直到 14 年前
        1
  •  2
  •   linuxuser27    14 年前

    如果模板化类需要来自多个接口的功能,那么这非常有用。例如,您可能需要类之间具有可比性, IComparable ,并且您还希望确保模板类的用户记住重写 ToString() 这样就可以显示数据, IFormattable .

    这是一个有点做作的回答,但能够多次指定精确的接口,可以让您在接口中保持功能,而不会使一个接口混乱。

        2
  •  4
  •   Bryan Watts    14 年前

    有时,您有泛型逻辑,它需要同时来自多个类型的功能。例如,我曾经在 Button , LinkButton ImageButton 来自ASP.NET的控件。它们分别来自 WebControl 并实施 IButtonControl 接口;没有将它们结合在一起的基类。

    我需要将一个处理程序连接到 Click 事件,暴露于 总线控制 ,并通过 Attributes 集合,由 基类 . 要同时启用这两种方法,我唯一的选择是多个类型约束:

    private T CreateButton<T>() where T : WebControl, IButtonControl, new()
    {
        var button = new T();
    
        button.Click += ...;
    
        button.Attributes["onClick"] = ...;
    
        return button;
    }
    
        3
  •  3
  •   Matthew Flaschen    14 年前

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

    IA asIA = param1;
    IB asIB = param1;
    

    此外,即使没有这些行,也可以将其用作其中之一(假定它们分别接受IA或IB参数)。

    IAFunc(param1);
    IBFunc(param1);