【问题标题】:How to declare a variable/param of type "Control implementing interface ISomething"?如何声明“控制实现接口 ISomething”类型的变量/参数?
【发布时间】:2010-10-07 15:30:30
【问题描述】:

我希望以这样一种方式声明一个变量,即它只能分配从 Control 派生的值,并且还实现 ISomething 接口。

我打算将 ISomething 接口添加到控件的派生类中。

我想从 TextBox 和 DatePicker 派生 SpecialTextBox 和 SpecialDatePicker 并在每个上实现 ISomething 接口。

我希望能够将这些控件中的每一个分配给一个变量,该变量的类型是“还实现 ISomething 的控件”,以便它们可以从那里调用它们的 ISomething 方法,或者可以添加到一个控件集合中表格。

那么....如何声明类型为“Control which also implements ISomething”的变量

理想的答案是在 VB.Net 中,但我也对 C# 方法感兴趣。

【问题讨论】:

    标签: c# vb.net winforms controls interface


    【解决方案1】:

    一种方法是使用泛型 - 即泛型方法:

    void Foo<T>(T control) where T : Control, ISomething
    {
        // use "control"
        // (you have access to all the Control and ISomething members)
    }
    

    现在您可以使用其他变量调用 Foo,这些变量是实现 ISomethingControl - 但是您不需要指定泛型:

    Foo(someName);
    

    就是你所需要的。如果你给它的东西不是ControlISomething,编译器会告诉你。


    更新:我不“做”VB,但反射器告诉我上面的翻译为:

    Private Sub Foo(Of T As { Control, ISomething })(ByVal control As T)
    
    End Sub
    

    【讨论】:

    • 我需要一点时间才能理解这一点,但这就是我所追求的
    • erm 无法删除以前的评论以重述它......我的意思是“......但是(我怀疑)它是......”
    • 所以如果我理解正确的话......在这个方法的范围内......T型将满足我的要求......好吧该死的已经足够了......非常感谢...... 。 好东西。我明白为什么你的声望这么高了:)
    • 这正是通用约束的意思,是的。在 Foo 中,可以保证类型 T(由调用者提供)满足这些条件。
    • 我不认为您可以从通用约束继承? :D
    猜你喜欢
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多