2

我正在设计一个 Visual Basic 应用程序,它使用我创建的一个 DLL(都在 Visual Studio 上)。在应用程序中,有一个对象实例化了一个由 DLL 定义的类。

Friend WithEvents robot As New DLL1class

该项目有新的需求,因此该对象应该能够从不同的新 DLL 实例化一个类。由于我正在设计这个新的 DLL,我想让这个更改对应用程序透明,所以我也这样做:

Friend WithEvents robot As New DLL1class

或者

Friend WithEvents robot As New DLL2class

我的想法是创建一个InterfaceIOperations并让两个DLL实现它,所以代码上没有问题。

由于我需要在运行时实例化对象,我的问题是,我应该用哪个类创建它?

Friend WithEvents robot As ¿?¿?¿?
' ...
If xxxxx Then
    robot = New DLLXClass
End If

我不想使用As Object,因为在编程过程中您在编写时看不到函数列表,robot.并且代码和 DLL 函数太复杂而无法接受。

有什么方法可以定义一个实现接口的对象吗?类似于这个想法的东西:

Friend WithEvents robot As ClassX "that implements IOperations"

如果您认为有更好的方法来解决这个问题,我没关系!因为我认为这可能是您提出的一个问题:是的,有必要使用 DLL,因为我们需要将它们发送给在他们自己的应用程序上使用 DLL 的外部人员。

4

1 回答 1

1

您需要将变量声明为接口而不是具体类之一,例如:

Friend WithEvents robot as IOperations

现在,该robot变量可以引用碰巧实现该接口的任何类型的对象。接下来,您需要根据情况有条件地将robot变量设置为正确的对象类型。例如,在构造函数中,您可以执行以下操作:

If UsingDll1 Then
    robot = New DLL1class()
Else
    robot = New DLL2class()
End If

只要这两个类都实现了IOpertions接口,它就会编译并正常工作。

咆哮

现在是我的 DI 咆哮的时候了。如果你不在乎我的想法,请跳过这部分:)

让类像这样创建自己的依赖项是不好的做法。随着项目的发展,它会变得越来越复杂,并且会导致意大利面条式代码。避免这种情况的方法是使用依赖注入(DI)。例如,在这种情况下,您可以这样设计您的类:

Public Class MyClass
    Public Sub New(robot As IOperations)
        Me.robot = robot
    End Sub

    Friend WithEvents robot as IOperations
End Class

现在,该类不再创建自己的机器人对象,而是请求将机器人提供给它。通过这种方式,它的依赖项(机器人)被注入其中。

这样想:如果你有一个汽车类,它应该创建自己的引擎对象吗?在现实生活中,汽车是自己制造引擎,还是由汽车厂提供?就像创建一辆可以创建自己的引擎的汽车会非常复杂和愚蠢一样,让类创建自己的依赖项也是复杂而愚蠢的。

于 2013-04-05T14:56:22.503 回答