2010-06-04 10 views
0

Je suis en train d'ajouter des membres Partagés dans les classes dérivées et l'utilisation que les valeurs dans les classes de base ...Comment utiliser la classe dérivées des variables partagées dans les méthodes communes de classe de base

J'ai la base

class DBLayer 
    public shared function GetDetail(byval UIN as integer) 
    dim StrSql = string.format("select * from {0} where uin = {1}", tablename, uin) 
    .... 
    end function 
end class 

ma classe

class User inherits dblayer 
    public shared tabledname as string = "users" 
end class 

class item inherits dblayer 
    public shared tabledname as string = "item" 
end class 

class category inherits dblayer 
    public shared tabledname as string = "category" 
end class 

dérivé Actuellement, il y a une erreur en utilisant la variable tablename d'une classe dérivée dans ma classe de base.

Répondre

0
Class User 
    Inherits DBLayer 
    Public Shared Shadows Function TableName() As String 
     Return "users" 
    End Function 
    Public Overrides Function GetTableName() As String 
     Return User.TableName 
    End Function 
End Class 

MustInherit Class DBLayer 
    MustOverride Function GetTableName() As String 

    Public Function GetDetail(ByVal UIN As Integer) 
     Return GetDetail(UIN, GetTableName) 
    End Function 

    Public Shared Function GetDetail(ByVal UIN As Integer, ByVal TableName As String) 
     Dim StrSql As String = String.Format("select * from {0} where uin = {1}", TableName, UIN) 
     Return StrSql 
    End Function 

End Class 

Class DBLayer 

    Private _tableName As String 
    Public Property TableName() As String 
     Get 
      Return _tableName 
     End Get 
     Set(ByVal value As String) 
      _tableName = value 
     End Set 
    End Property 

    Public Sub New(ByVal tableName As String) 
     _tableName = tableName 
    End Sub 
    Public Function GetDetail(ByVal UIN As Integer) 
     Return GetDetail(UIN, Me.TableName) 
    End Function 

    Public Shared Function GetDetail(ByVal UIN As Integer, ByVal TableName As String) 
     Dim StrSql As String = String.Format("select * from {0} where uin = {1}", TableName, UIN) 
    End Function 

End Class 
+0

Assurez-vous que la deuxième méthode fonctionne mais que la première méthode se termine par une erreur appelant la fonction de nom de table de la classe de base au lieu de la fonction de classe enfant. Mais je préférerais la première méthode. Y a-t-il un remède pour la première méthode? – KoolKabin

+0

@KookKabin: La deuxième méthode est tellement plus propre, maintenable et plus facile à lire. Moins de chance d'erreurs. – AMissico

+1

@KoolKabin: J'ai mis à jour la première méthode, mais c'est un mauvais design. Utiliser Partagé à cette fin n'est pas conseillé car vous avez "changé" ce que signifie share/static pour l'implémentation de cette classe. En d'autres termes, la valeur partagée n'est plus partagée entre toutes les classes, y compris les classes dérivées. Par conséquent, le programmeur doit être discipliné pour utiliser ces classes. De plus, ils ont beaucoup de mal à déboguer et à lire le code. Basé sur mon expérience et connaissance de concevoir des bibliothèques, je suggère fortement la deuxième méthode, mais l'expérience. C'est un changement relativement facile. – AMissico

0

Je crée

Protected MustInherit Readonly Property TableName as string 

dans la classe de base. Et puis chacune des classes enfant devra le remplacer et retourner le nom correct de la propriété.

Ainsi, dans l'une des classes de l'enfant, il serait:

Protected OverRides Readonly Property TableName as string 
    Get 
     Return "users" ' or category or item etc 
    End Get 
End Property 
+0

est que la propriété partagée ... Je veux la propriété partagée – KoolKabin

+0

votre script dit « Erreur :: Les propriétés ne peuvent pas être mustinherit " – KoolKabin

+0

Désolé, ce sont les classes qui sont MustInherit, il devrait être MustOverride. J'ai raté le sujet du partage, je ne pense pas que tu puisses faire ça alors. Bien que je reconsidère votre conception si vous faites l'héritage des classes partagées, il pourrait être approprié parfois mais j'y penserais soigneusement. –

Questions connexes