2016-05-03 14 views
0

Ich nehme an, T zu verwenden, aber ich bin mir nicht sicher, wie es richtig geht.Implementieren Sie die gleiche Logik für verschiedene Objekte wie T

Betrachten wir folgendes Beispiel.

Basisklasse:

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 

Beispiel Klassen, die von der Basisklasse erben:

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 

Wie bereits zwei Klassen zu sehen, die in ihren Methoden von Base erbt werden konnte hat die gleiche Logik (manchmal ich habe zu verwenden zusätzliche Parameter daher Überladungen dort, aber benutze diffrent DAL Klasse, um zu rufen. Ich möchte diese Logik in der Basisklasse implementieren und für jeden Punkt nur zu bestimmten DAL. Wie man das nicht immer in diesen Klassen schreibt zB:

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

EDIT:

htmlbase Konstruktor:

Sub New() 
    End Sub 

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

HtmlSubSection des Konstrukteurs:

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 des Konstrukteurs:

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 

Antwort

0

Sie brauchen hier keine generischen Typen. Verwenden Sie einfach Interfaces, Sub Classing und Polymorphism korrekt.

Neue Schnittstelle IDAL, die von DAL-Klassen implementiert wird von verschiedenen Methodennamen loszuwerden, die gleichen Parameter nehmen und das Gleiche tun:

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 

Basisklasse geändert zu abstrahieren und der Konstruktor nimmt nun IDAL Parameter. Die Funktion kann jetzt polymorph ausgeführt werden. Es wurde eine isExists(string) Funktion Überlastung zu vermeiden:

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 

Client-Klassen müssen nur richtig DAL Basisklasse geben:

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 

Grundsätzlich wäre es ideal, wenn IGetInformation eine isExist Methode mit einem optionalen String-Parameter hatte . Dies würde eine unnötige Methode in HtmlBase speichern.

+0

Was, wenn ich mehr Konstruktoren für jedes z. B. HtmlSection, HtmlSubSection haben? Schau dir Hauptredaktion an, ich habe dir gezeigt wie es genau aussieht. Muss ich diesen Dal-Parameter immer in alle Konstruktoren setzen oder? Würde schätzen, dass Ihre Poständerung dementsprechend ist. –

Verwandte Themen