我可以让方法对某些类可见,但不能对其他类可见

时间:2018-01-10 11:58:34

标签: vba excel-vba scope excel

非常简单;我用另一个类调用此方法的公共方法创建了一个类。

我希望这个方法只出现在第二类的intellisense中,它对第一类有一些特殊的引用。任何其他类或模块都不应该看到该方法。

的内容
Semi-Private (except for Class2) Sub ...

在Class1的方法中,或在Class2中

Can See Semi-Private methods of Class1

3 个答案:

答案 0 :(得分:2)

不要让它变得复杂,而是使用迂回方法,只需使用适合工作的工具:

课程模块IFoo

Public Sub Bar()
    ' Interface methods are empty
End Sub

Class Module Foo

Private Type TFoo
    Baz As String
End Type

Private this As TFoo

Implements IFoo

Private Sub Class_Initialize()
    this.Baz = "I am a class that implements IFoo."
End Sub

Private Sub IFoo_Bar()
    ' Do Something
    Debug.Print this.Baz
End Sub

模块Baz

Sub RunBaz()
    Dim MyFoo As IFoo

    ' Note that this WILL NOT work. Nothing happens.
    Set MyFoo = New IFoo
    Debug.Print MyFoo.Bar

    ' Set MyFoo to be equal to a Foo (which implements IFoo)
    Set MyFoo = New Foo
    Debug.Print MyFoo.Baz
End Sub

这使得方法仅在通过使其公开的接口访问方法时可见。因此,为了使用Foo中的方法,我们必须首先使用Foo变量类型创建IFoo的实例。

然后,就像创建一个新类一样简单,该类从Foo创建IFoo供自己使用。

课程模块IImportantWorker

Public Sub DoSomethingImportant()

End Sub

班级模块ImportantWorker

Private Type TImportantWorker
    Implementation As IFoo
End Type

Private this As TImportantWorker

Implements IImportantWorker

Private Sub Class_Initialize()
    Set this.Implementation = New Foo
End Sub

Public Sub IImportantWorker_DoSomethingImportant()
    this.Implementation.Bar
End Sub

你可以从这里得到一种幻想,并使IFoo公开的Foo属性告诉它是否可以工作。这必须通过IFoo接口公开(或者,也可以是单独的接口,以便两个接口必须结合使用)。

没有锁定这个类(我不建议这样做,它看起来很愚蠢而且毫无意义)Foo如果它被创建为Bar仍会允许IFoo }。但是,如果你只是Foo = New Foo,那么Foo将不会做任何事情(或者更确切地说,什么都不曝光)。

对于其他资源,我强烈建议您阅读这些有关流程更深入的优秀帖子:

Is VBA an OOP language, and does it support polymorphism?

https://rubberduckvba.wordpress.com/2016/06/16/oop-vba-pt-1-debunking-stuff/

https://rubberduckvba.wordpress.com/2016/07/05/oop-vba-pt-2-factories-and-cheap-hotels/

答案 1 :(得分:0)

您可以创建包含所有属性和方法的类,将其命名为BigClass:

split /\s+/

然后你可以创建继承BigClass方法的类,但不是必需的。例如,只使用var3变量的SmallClass1。

Option Explicit

Dim i1 As Integer
Dim i2 As Integer
Dim i3 As Integer


Property Let var1(v As Integer)
    i1 = v
End Property

Property Get var1() As Integer
    var1 = i1
End Property

Property Let var2(v As Integer)
    i2 = v
End Property

Property Get var2() As Integer
    var2 = i2
End Property

Property Let var3(v As Integer)
    i3 = v
End Property

Property Get var3() As Integer
    var3 = i3
End Property

然后您可以创建使用var2和var1但不使用var3的SmallClass2。你明白了。

答案 2 :(得分:0)

一个明确的例子涉及且冗长,我在我的博客上存放了一个VBA - Difference between Friend and Public with inter project references.

基本上你使用了Friend关键字,但是直到你将代码分割到工作簿之后才会发生任何事情,因为工作簿本身会带来Instancing和工厂函数等问题。给出的例子应该可行。享受!