非常简单;我用另一个类调用此方法的公共方法创建了一个类。
我希望这个方法只出现在第二类的intellisense中,它对第一类有一些特殊的引用。任何其他类或模块都不应该看到该方法。
的内容
Semi-Private (except for Class2) Sub ...
在Class1的方法中,或在Class2中
Can See Semi-Private methods of Class1
答案 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和工厂函数等问题。给出的例子应该可行。享受!