为不同的对象实现与T相同的逻辑

时间:2016-05-03 07:43:15

标签: vb.net

我想使用T但是我不确定它是如何正确的。

让我们考虑以下示例。

基类:

Public Class HtmlBase
            Implements IGetInformation

   Public Overridable Function IsExist() As Boolean Implements IGetInformation.IsExist
           Throw New NotImplementedException()
   End Function

   Public Overridable Function GetIdByName(pName As String) As Integer Implements IGetInformation.GetIdByName
        Throw New NotImplementedException()
   End Function

End Class

从基类继承的示例类:

Public Class HtmlSubSection
      Inherits HtmlBase

'--sometimes i have to overload to add additioinal parameter
Public Overloads Function isExist(subsection As String) As Boolean
      Dim dlsubkategorie As New DataLayer.DALSubSection
      Return dlsubkategorie.CheckIfSubSectionExist(subsection)
End Function

Public Overrides Function GetIdByName(subsectionName As String) As Integer
      Dim dlget As New DataLayer.DALSubSection
      Return dlget.GetSubSectionIdByName(subsectionName)
End Function

End Class


Public Class HtmlSection
     Inherits HtmlBase

    'sometime i have to overload to add additioinal parameter

Public Overloads Function IsExist(section As String) As Boolean
     Dim dlsubkategorie As New DataLayer.DALSection
     Return dlsubkategorie.CheckIfSectionExist(section)
End Function

Public Overrides Function GetIdByName(Name As String) As Integer
      Dim dlsubkategorie As New DataLayer.DALSection
      Return dlsubkategorie.GetSectionIdByName(Name)
      End Function
End Class

从上面可以看出,在其方法中从base继承的两个类具有相同的逻辑(有时我必须使用附加参数,因此在那里重载,但是使用不同的DAL类来调用。我想在base中实现这个逻辑class和每个只指向特定的DAL。如何做到这一点,不是每次在这些类中编写例如:

Dim dlsubkategorie As New DataLayer.<DALSection>
Return dlsubkategorie.GetSectionIdByName(Name)

修改

Htmlbase构造函数:

 Sub New()
    End Sub

    Sub New(pId As Integer)
        _Id = pId
    End Sub

HtmlSubSection的构造函数:

 Sub New()
        MyBase.New()
        AvailableSentences = New List(Of HtmlSubSection_Sentence)
        SelectedSentences = New List(Of HtmlSubSection_Sentence)
    End Sub
    Sub New(pId As Integer)
        MyBase.New(pId)
    End Sub
    Sub New(pName As String)
        _Name = pName
    End Sub

    Sub New(pId As Integer, pName As String)
        MyBase.New(pId)
        _Name = pName
    End Sub

HtmlSection的构造函数:

Sub New()
        MyBase.New()
    End Sub

    Sub New(pId As Integer)
        MyBase.New(pId)
    End Sub
    Sub New(pId As Integer, pName As String, pPosition As Integer)
        MyBase.New(pId)
        _Name = pName
        _Position = pPosition
    End Sub

    Sub New(pName As String)
        _Name = pName
    End Sub

    Sub New(pName As String, pPosition As Integer)
        _Name = pName
        _Position = pPosition
    End Sub

1 个答案:

答案 0 :(得分:0)

这里不需要通用类型。只需正确使用接口,子类和多态。

新接口IDAL,由DAL类实现,以删除采用相同参数并执行相同操作的不同方法名称:

Public  Interface  IDAL
        Function  CheckIfSectionExist(section As string) As Boolean
        Function  GetSectionIdByName(section As string) As Integer
End Interface

 Public  Class DALSection
        Implements  IDAL

        Public Function  CheckIfSectionExist(section As string) As Boolean Implements IDAL.CheckIfSectionExist
            ...
        End Function

        Public Function GetSectionIdByName(section As String) As Integer Implements IDAL.GetSectionIdByName
            ...
        End Function
 End Class

    Public  Class DALSubSection
        Implements  IDAL

       Public Function  CheckIfSubSectionExist(subSection As string) As Boolean Implements IDAL.CheckIfSectionExist
            ...
        End Function

        Public Function GetSubSectionIdByName(subSection As String) As Integer Implements IDAL.GetSectionIdByName
            ...
        End Function
    End Class

基类更改为抽象,构造函数现在采用IDAL参数。函数现在可以执行多态。添加了isExists(string)函数以避免重载:

Public MustInherit Class HtmlBase
            Implements IGetInformation

    Public Property DAL as DataLayer.IDAL
    Protected  Sub New(dal as DataLayer.IDAL)
        Me.DAL = dal
    End Sub

   Public Overridable Function isExist() As Boolean Implements  IGetInformation.isExist
         Return True 
   End Function 

   Public Overridable Function isExist(section As String) As Boolean
         Return DAL.CheckIfSectionExist(Section)
   End Function 

   Public Overridable Function GetIdByName(pName As String) As Integer Implements IGetInformation.GetIdByName
        Return DAL.GetSectionIdByName(pName)
   End Function
End Class

客户端类只需要为基类提供正确的DAL:

Public Class HtmlSubSection
      Inherits HtmlBase
    Public Sub New() 
        MyBase.New(New DataLayer.DALSubSection)
    End Sub
End Class

Public Class HtmlSection
     Inherits HtmlBase

    Public Sub New() 
        MyBase.New(New DataLayer.DALSection)
    End Sub
End Class

基本上,如果IGetInformation具有带有可选字符串参数的isExist方法,那将是理想的。这将在HtmlBase中保存一个不必要的方法。