使用不同的DataType覆盖属性

时间:2016-02-03 19:54:42

标签: vb.net class inheritance types overrides

如何从继承的类覆盖属性但使用不同的返回类型?

我正在使用这样的课程设置:

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',因为它们的返回类型不同。”

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

我正在学习班级等级,但尚未掌握它,所以如果你认为我想要做的事情没有意义,或者我错过了一些明显的东西,我会接受。

1 个答案:

答案 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 是字符串版本的明显选择。这在某种程度上取决于实际的课程,但我倾向于避免这种情况。