Vb.net 使用不同的数据类型重写属性

Vb.net 使用不同的数据类型重写属性,vb.net,class,inheritance,types,overriding,Vb.net,Class,Inheritance,Types,Overriding,如何从继承的类重写属性,但使用不同的返回类型 我正在与这样一个班级合作: Public MustInherit Class foo Public MustOverride Property Value As Object End Class 我想继承此类,但让Value属性返回不同的类型: Public Class foo_string Inherits foo Public Overrides Property Value As String End Class

如何从继承的类重写属性,但使用不同的返回类型

我正在与这样一个班级合作:

Public MustInherit Class foo
    Public MustOverride Property Value As Object
End Class
我想继承此类,但让Value属性返回不同的类型:

Public Class foo_string
    Inherits foo

    Public Overrides Property Value As String
End Class

Public Class foo_date
    Inherits foo

    Public Overrides Property Value As Date
End Class
这给了我一个错误:“'Public Overrides Property Value As String'无法重写'Public MustOverride Property Value As Object',因为它们的返回类型不同。”

我可以从基类中删除属性,只在子类中指定它,但是我想知道是否有其他方法可以使它工作


我正在学习类层次结构,但还没有掌握它,所以如果你认为我试图做的没有意义或者我遗漏了一些明显的东西,我会接受的。

你可以这样做,但这可能不是一个好主意

Public MustInherit Class fooBase(Of T)
    Public MustOverride Property Value As T   
End Class

Public Class FooBaseA
    Inherits fooBase(Of String)

    Public Overrides Property Value As String
End Class
用法:

Dim foo As New FooBaseA
这是另一种选择:

Public Interface FooValue(Of T)
    Property Value As T
End Interface

Public Class fooA
    Implements FooValue(Of String)

    Public Property Value As String Implements FooValue(Of String).Value
End Class
问题在于,您不希望必须使用代码来检查每个对象的类型,以便代码知道如何使用属性:

Dim fa As New FooA
Dim fb As New FooB

If TypeOf fb Is FooB Then
    Console.WriteLine(fb.Value.DayOfWeek)
End If

' or:
If fb.Value.GetType Is GetType(DateTime) Then
    Console.WriteLine(fb.Value.DayOfWeek)
End If

如果数据类型不同,则它们可能应具有不同的名称、单独的属性,并在派生类上实现<代码>文本显然是字符串版本的选择。这在某种程度上取决于实际的类,但我倾向于避免这种情况。

根据您的具体需要,您可以通过将
foo
a设置为。