2011-05-24 44 views
0

我正在寻找一个小专家的设计见解。我试图从一个泛型类保存一个重载的属性。Vb.Net泛型与重载事件混合

基类

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 

提前感谢! Ryan

+0

很高兴看到人们使用VB进行OOP透视,而不是人们仍然持有的VB6方式。荣誉给你! – Jeremy 2011-05-24 22:08:37

+0

谢谢,我是一个VB.Net/C#程序员。这项新工作全部都是VB,所以它的时间让我的大脑再次切换模式。 – Ryan 2011-05-25 14:16:19

回答

0

您有跳出两个问题。首先是你试图给同名的财产赋予两个含义。即使像你这样的超载被允许,它是非常差的设计(tm)。这对于任何需要稍后查看代码的人来说都会很困惑。

因此,假设您在显示的方法的派生类和else分支中将字符串版本更改为LocationName,我们遇到了第二个问题。粗略地说,你在这个方法中引用了一个基类。但是,您正尝试从派生类中调用方法。为此,您需要进一步限制泛型类型或执行类型转换。

我不知道在哪里fooStringotherPlace来自于你的榜样,但如果他们都应该是相同的字符串,它可能是最好有你的方法采取Func(Of String, BaseEvent),而不是依靠IsWorkCalendar。作为副作用,这将消除该方法为通用的需要。