2016-02-03 2 views
1

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

Я работаю с классом создан так:

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 переопределяет значение свойства As String» не может переопределить «значение свойства public MustOverride как объект», потому что они отличаются по своим типам возврата ».

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

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

+1

В зависимости от того, что вы хотите, вы можете достичь этого, создав 'foo' [Generic Class] (https://msdn.microsoft.com/en-us/library/w256ka79.aspx). – Blackwood

ответ

2

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

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 - очевидный выбор для строковой версии. Это зависит от реальных классов, но я бы склонен избегать этого.

Смежные вопросы