【问题标题】:vb.net extending a class with genericsvb.net 用泛型扩展一个类
【发布时间】:2013-09-12 10:55:19
【问题描述】:

是否可以用同一个泛型类扩展不同的类? 我尝试过这样的事情:

Public Class A
  Public Sub TestA()
    Debug.Print("Test A")
  End Sub
End Class

Public Class B(Of T)
  Public Sub TestB()
    Debug.Print("Test B")
  End Sub
End Class

Public Class C
  Inherits B(Of A)

  Public Sub TestC()
    TestA() '**<-- Thows error 'is not declared'** 
    TestB()
    Debug.Print("Test C")
  End Sub
End Class

我基本上有一些用户控件,它们派生自 Combobox 或 Textbox,我希望两者都实现一些在基类中定义的函数(和接口)。在 C++ 中,我会使用多继承来实现。

【问题讨论】:

标签: vb.net generics


【解决方案1】:

可以用同一个泛型类扩展不同的类吗?

泛型不是缺乏多重继承的某种“解决方法”,不是。你的类C 不是从A 派生的——它只是意味着B(Of T) 中的TC 的上下文中是A

您希望调用TestA() 的哪个实例?创建C 的实例肯定不会创建A 的实例...

B(Of T) 不在任何地方使用 T 的事实应该是一个警告信号 - 泛型但从不使用其泛型类型参数的类型通常是有问题的。

如果没有更多细节,很难确切知道如何帮助您解决实际问题,但是当您还需要从不受您控制的其他类型派生时,您不能像这样添加公共基类.

也许extension methods 会有所帮助?

【讨论】:

  • 是的,你是对的......不知道我可以在接口上定义扩展方法......我会试试的
【解决方案2】:

您可以让 Combobox 和 Textbox 类实现相同的接口。

然后您可以在该接口类上定义扩展方法。

【讨论】:

    【解决方案3】:

    感谢您的提示,我得到了扩展功能

    Public Class Form1
    
        Public Interface IA
            Property val As String
        End Interface
    
        Public Class A
            Public Sub test()
                Debug.Print("test")
            End Sub
        End Class
    
        Public Class C
            Inherits A
            Implements IA
    
            Public Property val As String Implements IA.val
    
            Public Sub TestC()
                val = "testxxx"
                TestA()        
                test()
            End Sub
        End Class
    
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Dim ct As New C
            ct.TestC()
        End Sub
    End Class
    
    Module TestModule
        <Extension()>
        Public Sub TestA(ByVal pvIA As IA)
            Debug.Print(pvIA.val)
        End Sub
    End Module
    

    这样每个类都可以实现它自己的“父类”(就像这里的 A),我不需要为每个类实现函数 TestA。

    谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多