Обобщение Vb.Net с перегруженным событием - PullRequest
0 голосов
/ 25 мая 2011

Я ищу небольшую экспертную оценку дизайна. Я пытаюсь сохранить перегруженное свойство из универсального класса.

Базовый класс

 Public MustInherit Class BaseEvent

    Public MustOverride ReadOnly Property IsWorkCalendar() As Boolean

    Private _Location As Enums.LocationType
    Public Overridable Property Location() As Enums.LocationType
        Get
            Return _Location
        End Get
        Set(ByVal value As Enums.LocationType)
            _Location = value
        End Set
    End Property

End Class

Реализован класс BaseEvent

Public Class MyEvent
    Inherits BaseEvent

    Private _Location As String
    Public Overloads Property Location As String
        Get
            Return _Location
        End Get
        Set(value As String)
            _Location = value
        End Set
    End Property
End Class

Общий класс

Public Function GetItemHeaders(Of T As {Core.Events.BaseEvent, New})() As IEnumerable(Of Core.Events.BaseEvent) Implements IMethods.GetItemHeaders
    Dim myEvents = Helper.GetAllEvents(_Service)
    Dim genericEvents As New List(Of BaseEvent)()

        ...loop through items...            

        Dim genericEvent As T = New T()

        If genericEvent.IsWorkCalendar Then
            Dim location As Enums.LocationType = Enums.LocationType.NotConfigured
            If ([Enum].IsDefined(GetType(Enums.LocationType), fooString)) Then
                location = [Enum].Parse(GetType(Enums.LocationType), fooString)
            End If
            genericEvent.Location = location
        Else
            - Always uses the BaseEvent Location and casses an error since I am trying to store a string

            genericEvent.Location = otherPlace
        End If

        ....

        genericEvents.Add(genericEvent)

    Next

    Return genericEvents
End Function

Заранее спасибо! Райан

Ответы [ 2 ]

0 голосов
/ 25 мая 2011

У вас две проблемы, которые выпрыгивают. Во-первых, вы пытаетесь придать объекту с одинаковым именем два значения. Даже если допустима перегрузка, как вы, это Очень плохой дизайн (тм) . Это будет очень запутанным для любого, кто будет смотреть на код позже.

Сделав вид, что вы изменили строковую версию на LocationName как в производном классе, так и в ветви else метода, который вы показали, мы столкнулись со второй проблемой. Грубо говоря, у вас есть ссылка на базовый класс в этом методе. Однако вы пытаетесь вызвать метод из производного класса. Для этого вам необходимо либо еще больше ограничить универсальный тип, либо выполнить приведение типа.

Я не уверен, откуда взялись fooString и otherPlace в вашем примере, но если они оба должны быть одной и той же строкой, может быть лучше, чтобы ваш метод взял Func(Of String, BaseEvent) вместо опоры на IsWorkCalendar. В качестве побочного эффекта это устранит необходимость в том, чтобы метод был универсальным.

0 голосов
/ 25 мая 2011

Я думаю, что ваша проблема в том, что свойство, которое вы пытаетесь перегрузить, имеет одинаковую сигнатуру (отличается только типом возвращаемого значения).В общем, вы не можете этого сделать.Прочтите этот похожий пост:

Есть ли способ перегрузить свойство в .NET?

...