我有两个类来处理数据库操作,一个用于MySQL(DBMySQL),另一个用于SQLite(DBSQLite)。用户选择使用哪个数据库系统。
类中的函数具有相同的名称,但处理数据库中的变体显然略有不同。
我想在整个申请中用一个名称来引用所选择的类。我设置了一个全局变量DB。
在一个程序中,我可以:将数据库Dim作为新的DBMySQL(或DBSQLite)。这在程序中有效,但不是全局的,但我可以在编码时看到所有的功能。
如果我改为使用:DB = New DBMySQL,它可以全局工作,但编码时不会显示类函数。
任何替代方案?
答案 0 :(得分:0)
使用inheritance的概念,并使用MustInherit方法和/或属性创建MustOverride类。
Public MustInherit Class AbstractDB
Public MustOverride Function MyQuery(input As Object) As Object
Public MustOverride Sub MyUpdateMethod(input As Object)
End Class
Public Class DBMySQL
Inherits AbstractDB
Public Overrides Function MyQuery(input As Object) As Object
End Function
Public Overrides Sub MyUpdateMethod(input As Object)
End Sub
End Class
Public Class DBSQLite
Inherits AbstractDB
Public Overrides Function MyQuery(input As Object) As Object
End Function
Public Overrides Sub MyUpdateMethod(input As Object)
End Sub
End Class
然后,当您想要使用类时,请创建类型为AbstractDB的DB全局变量。然后,您可以创建DBMySql或DBSQLite并将其分配给您的DB变量。方法名称都是相同的,因为它们都继承了相同的基类。但是每个派生类必须自己填写这些方法的内容。
Dim DB as AbstractDB = New DBMySQL
答案 1 :(得分:0)
您也可以使用界面。
Public Interface IRepository
' common functions of MySQL and SQLLiteclasses
End Interface
Public Class MySQLRepository
Implements IRepository
End Class
Public Class SQLLiteRepository
Implements IRepository
End Class
Public Function GetDB(userChoice As String) As IRepository
If userChoice = "MySQL" Then
Return New MySQLRepository()
Else
Return New SQLLiteRepository
End if
End Function
Dim DB As IRepository = GetDB(userChoice)
这是Repository模式的基本实现。链接中的示例是在C#中,但是,正如您可能知道的那样,在VB中查找示例并不容易。幸运的是,有很多C#到VB的转换器。
Sean Skelly给出的抽象例子也应该有效。您可能想要研究抽象类和接口之间的区别。