在子类中“覆盖”共享成员的方法

时间:2010-03-05 12:36:27

标签: vb.net

目前我正在尝试在vb.net中创建一种可用于创建/获取数据库托管的模型。

我创建了一个主类Model,它带有一个共享函数来获取数据集,例如Model.find()。 现在我想创建继承主要Model-Class的类,例如用户单独的一个:UserModel.find()=> “SELECT * FROM users”。

我现在需要的是找到一种方法来告诉Class它应该使用哪个表。我想到了一个抽象的字符串“表”,它是每个“子模型”中的一个常量,但是如何实现它,因为它不可能覆盖共享成员?

提前致谢!

编辑:也许这会让我的意思更加清晰:

Public Class Model
Public Shared _controller As Controller

Public Shared table As String
Protected Shared tableFields As String()
Shared reader As Npgsql.NpgsqlDataReader

Public Shared Function find()
    Dim a As ArrayList = New ArrayList

    'Test if the tablefields are already known to the class, if not, get them

    If tableFields Is Nothing Then
        getTableFields()
    End If

    Dim query As String = "SELECT " + String.Join(", ", tableFields) + " FROM " + table
    reader = _controller.executeReader(query)
        While reader.Read
            o = New Model
            Dim v As New Hashtable
            For Each field In tableFields
                v(field) = reader(field)
            Next
            o.values = v
            a.Add(o)
        End While
        reader.Close()
        Return DirectCast(a.ToArray(GetType(Model)), Model())
End Function

Public values As Hashtable

Public Sub New()
End Sub

End Class

所以我想要一个共享方法,它找到所有数据库条目并返回一个自己类型的实例数组,例如:模型()。 这就是为什么我想保持find-method共享而不是绑定到实例。

4 个答案:

答案 0 :(得分:4)

我认为你可以使用Generics。这里我贴了一个例子

您域中的所有类都可以从实体类

继承
Public MustInherit Class Entity

    '...

End Class

您的模型类,使用您的方法查找

Public Class Model

    Public Shared Sub Find(Of T As Entity)()

        ' You could know the name of T to find the table

        Dim tableName As String = GetType(T).Name

        '... 

    End Sub

End Class

您的某个类别,例如:用户类

Public Class User
    Inherits Entity

    ' ...

End Class

最后,如何实例化Find方法

的示例
Model.Find(Of User)()

'...

我不知道如果这是你的意思,你觉得这有用吗?

答案 1 :(得分:0)

您可以使您的主类抽象化,并且每个子类必须通过其自己的实现(例如getTableName)返回其“自己的”表名。这样,您只需要在主类中维护方法逻辑。

答案 2 :(得分:0)

在这种情况下使用Singleton设计模式是很常见的:创建一个实例方法,通过继承类来重写。每个继承类都应该让该实例方法返回与该类相关的Singleton对象。

这是一种方法:

MustInherit Class BaseClass
    Public MustOverride Function getTableName() As String
End Class

Class Class1
    Inherits BaseClass
    Private Shared TableName As String = "myTable1"
    Public Overrides Function getTableName() As String
        Return TableName
    End Function
End Class

Class Class2
    Inherits BaseClass
    Private Shared TableName As String = "myTable2"
    Public Overrides Function getTableName() As String
        Return TableName
    End Function
End Class
编辑:一种完全不同的方法。 您可以让基类保存一些字典,该字典将类类型(或类型名称)与正确的表相关联:

Class BaseClass
    Private Shared myDictionary As New Collections.Generic.Dictionary(Of Type, String)
    Friend Shared Sub RegisterType(ByVal childType As Type, ByVal tableName As String)
        myDictionary.Add(childType, tableName)
    End Sub
    Public Shared Function getTableName(ByVal childType As Type) As String
        Return myDictionary.Item(childType)
    End Function
End Class
Class Class1
    Shared Sub New()
        BaseClass.RegisterType(GetType(Class1), "table1")
    End Sub
End Class
Class Class2
    Shared Sub New()
        BaseClass.RegisterType(GetType(Class2), "table2")
    End Sub
End Class

答案 3 :(得分:0)

无法继承或覆盖共享(静态)对象或对象成员。继承是例如对象。由于您不必实例化静态类,因此无法从中继承。与方法相同。静态方法不应该是虚拟的(在VB中可以覆盖),因为它定义了一个执行没有该类实例的任务的方法。然后,这使得无法在静态(VB中的共享)方法中使用实例字段或属性。这是一个糟糕的设计。

实际上,每个静态(共享)类都应该在VB中标记为NotInheritable,并且只定义默认的空构造函数。这是关于OOP概念的VB泄漏。