如何从继承的类覆盖属性但使用不同的返回类型?
我正在使用这样的课程设置:
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',因为它们的返回类型不同。”
我可以从基类中删除属性,只在子类中指定它,但我想知道是否有其他方法可以使它工作。
我正在学习班级等级,但尚未掌握它,所以如果你认为我想要做的事情没有意义,或者我错过了一些明显的东西,我会接受。
答案 0 :(得分:2)
你可以这样做,但这可能不是一个好主意。
<TabControl ItemsSource="{Binding MyObservableCollection}" SelectedItem="{Binding MyObservableCollection[0]}" />
用法:
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
是字符串版本的明显选择。这在某种程度上取决于实际的课程,但我倾向于避免这种情况。