Переопределить свойство с другим типом данных

Как я могу переопределить свойство унаследованного класса, но использовать другой тип возвращаемого значения?

Я работаю с классом, настроенным следующим образом:

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

Это вызывает у меня ошибку: «« Общедоступное переопределяющее значение свойства как строку »не может переопределить« Общедоступное значение свойства MustOverride как объект », потому что они различаются по возвращаемым типам».

Я могу удалить свойство из базового класса и указать его только в подклассах, но мне интересно, есть ли другой способ заставить его работать.

Я изучаю иерархию классов, но еще не овладел ею, поэтому я приму, если вы считаете, что то, что я пытаюсь сделать, не имеет смысла или что мне не хватает чего-то очевидного.


person Kevin    schedule 03.02.2016    source источник
comment
В зависимости от того, что именно вы хотите, вы можете добиться этого, сделав foo Общий класс.   -  person Blackwood    schedule 03.02.2016


Ответы (1)


Вы можете это сделать, но, вероятно, это плохая идея.

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

Если тип данных отличается, они, вероятно, заслуживают других имен, отдельных свойств и для реализации в производных классах. Text - очевидный выбор для строковой версии. Это в некоторой степени зависит от реальных классов, но я бы предпочел этого избежать.

person Ňɏssa Pøngjǣrdenlarp    schedule 03.02.2016