【问题标题】:OOP pattern for sharing reference (using VBA)用于共享参考的 OOP 模式(使用 VBA)
【发布时间】:2020-07-21 03:05:34
【问题描述】:

我开始学习 OOP,如果我的 UML 不符合标准,请原谅我(或提供建议)。

由于业务限制,目前正在使用 VBA 编写,因此我无法访问继承,但它确实支持事件和接口。

我有一个文件夹类(蓝色),它有一个 FileSystemObject 类型的对象 mFileSystemObject

Folder 类在一个名为 Files 的数组中保存许多 File 对象。

每个 File 对象都有一个 FileDetails 对象(绿色)。

我想在 FileDetails 类中使用 FileSystemObject 类中的函数。

我想在 Folder 类中使用相同的 FileSystemObject 实例,因为我不想为每个 FileDetails 类实例化一个新实例并填满堆,并且我不会同时做任何工作。

所以我想将引用传递给 FileDetails 类,以便它们都使用同一个。

我能想到的唯一方法是通过 File 对象传递它,即使 File 不会使用它,这看起来有点难看。

我的问题是 - 有没有一种模式可以解决这个“通过”问题 - 我已经在网上搜索并查看了几种设计模式,但他们没有提供任何解决方案的建议。

任何帮助将不胜感激。

非常感谢

尼克

【问题讨论】:

  • 您可以实例化一个 FSO 类的单例对象,并让它被所有 FileDetails 对象和所有 Folder 对象使用。它的行为应该类似于 C# 中的 Static 对象,但我不知道 VBA 是否允许这样做。
  • 你是说你想要一个 FileDetails 的单个实例用于整个应用程序吗?所有Files 在所有Folders 中都使用同一个?
  • @ArcherBird,是的。至少这是我的建议。但真正需要尼克说明
  • 另外,您可以在 VBA 中采用 OOP 方法! :-)

标签: vba oop design-patterns reference


【解决方案1】:

所以这将是一个单例模式;在 VBA 中有几种方法可以做到这一点。我给你两个。

1) 创建一个新模块,我们称之为FileDetailsBuilder。在这个模块中,给它一个你的 FileDetails 类的私有实例。然后公开一个将返回其实例的公共函数,或者如果它不存在则创建一个新函数。

Option Explicit

Private mFD As FileDetails

Public Function GetObject() As FileDetails
    If mFD Is Nothing Then
        Set mFD = New FileDetails
    End If
    Set GetObject = mFD
End Function

现在,当您创建新的 File 对象时,您可以使用如下代码行设置其 FileDetails 成员:

Set mFileDeatils = FileDetailsBuilder.GetObject()

只要您的应用程序正在运行,mFD 实例成员就会一直存在。

2) 您可以更改 FileDetails 类中的一些代码,使其被视为单个预先声明的对象。为此,您需要导出类并更改一些您在 VBE 中看不到的代码。

在文本编辑器中,在您导出的 .cls 文件的顶部,您会看到一些属性分配。其中之一是VB_PredeclaredId。好吧,我的朋友,您可以编辑这个 .cls 文件并将该属性设置为 true:

Attribute VB_PredeclaredId = True

保存文件,然后将其重新导入您的 VBE 项目。现在,您不必实例化此对象。只需像使用静态对象一样使用它。当你创建新的File 对象时,像这样分配它们的成员:

Set mFileDeatils = FileDetails '// note the lack of new keyword

【讨论】:

  • 至于第 2 点):应该 "single, per-declared object.""single, pre-declared object。 "?
  • RubberDuck 可以为你设置VB_PredeclaredIdrubberduckvba.com
  • @HackSlash 嗯,爱我一些 RubberDuck :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-02
  • 1970-01-01
  • 2018-02-26
  • 2020-08-24
  • 1970-01-01
  • 2018-10-02
  • 2016-07-02
相关资源
最近更新 更多