派生类的泛型版是否可以使用泛型类型覆盖基本方法?

时间:2012-04-13 13:27:13

标签: .net vb.net oop generics clr

考虑:

Public MustInherit Class Column
    Public ReadOnly Property ReturnSomethingUseful() As Object
        Get
             'return something useful
        End Get
    End Property
End Class

Public Class TypedColumn(Of T)
    Inherits Column

    Public Overrides ReadOnly Property ReturnSomethingUseful() As T
        Get
             'return the same something useful, but as type T
             Return MyBase.ReturnSomethingUseful()
        End Get
    End Property
End Class

但这会产生以下错误:

  

Public Overrides Function ReturnSomethingUseful(sValue As String)As Boolean'       无法覆盖'Public Overridable Function ReturnSomethingUseful(sValue As String)As Object'       因为他们的回报类型不同。

我接受你不能这样做,但我希望能够保留我尝试做的事情的语义,这就是有一个无类型的交易版本使用Object,但是派生类中的类型版本知道特定类型T。有没有办法实现这个目标?

3 个答案:

答案 0 :(得分:5)

是的,有:使用Shadows修饰符

Public Shadows ReadOnly Property ReturnSomethingUseful() As T
    Get
         'return the same something useful, but as type T
         Return MyBase.ReturnSomethingUseful()
    End Get
End Property

答案 1 :(得分:2)

我不喜欢这个答案,但在我能找到真正优雅的解决方案之前,这就是我所做的事情:

Public Class TypedColumn(Of T)
    Inherits Column

    Public ReadOnly Property ReturnSomethingUsefulTyped() As T
        Get
          'return the same something useful, but as type T
          Return MyBase.ReturnSomethingUseful()
        End Get
    End Property
End Class

因此,它不是覆盖基本方法,而是使用不同的名称来表示它的作用。不是很好,但比处理Object类型更好,也比Shadows的问题更好。

答案 2 :(得分:0)

我被愚蠢的5分钟限制事物从编辑中切断了......

无论如何,我打算说,这有点像无法做以下事情:

Private _myProperty As Integer = 0

ReadOnly Property MyProperty As String
    Get
        Return _myProperty.ToString("0,###")
    End Get
End Property

WriteOnly Property MyProperty As Integer
    Set(value As Integer)
        _myProperty = value
    End Set
End Property

我认为能够为属性写一个不同于你读取的属性是有效的。例如,管理UI日期时间。简单地将日期时间作为格式化字符串读取比在UI代码中混乱更简洁。我知道我会在这里成为少数,真正的程序员会尖叫。

相关问题