如何在vb.net中通过一个名称引用两个不同的类

时间:2014-10-04 13:45:22

标签: vb.net

我有两个类来处理数据库操作,一个用于MySQL(DBMySQL),另一个用于SQLite(DBSQLite)。用户选择使用哪个数据库系统。

类中的函数具有相同的名称,但处理数据库中的变体显然略有不同。

我想在整个申请中用一个名称来引用所选择的类。我设置了一个全局变量DB。

在一个程序中,我可以:将数据库Dim作为新的DBMySQL(或DBSQLite)。这在程序中有效,但不是全局的,但我可以在编码时看到所有的功能。

如果我改为使用:DB = New DBMySQL,它可以全局工作,但编码时不会显示类函数。

任何替代方案?

2 个答案:

答案 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给出的抽象例子也应该有效。您可能想要研究抽象类和接口之间的区别。