当我们可以使用子例程或函数简单地传递和返回参数时,为什么我们需要在VBA类中使用属性Let
,Get
和Set
?
答案 0 :(得分:3)
您不需要......对于所有应用程序的90%,标准VBA是正确的。使用类,您可以对代码进行更多“逻辑控制”。
假设您有一个函数Function IsUnique(MyArg as String) as Boolean
,它会查找在MyArg
中传递名称的人员表,如果在表中找不到该名称,则返回TRUE
。没有什么可以阻止你调用这个函数并传递用户选择的喜欢的蔬菜的字符串。你仍会得到一个语法正确的程序,尽管这个调用总是返回TRUE
,因为蔬菜存储在这个应用程序的其他地方。
现在假设您有一个包含函数(= property)PersonClass
和Name
IsUnique()
你的代码最后你可能会喜欢这个
Dim MySpouse as PersonClass
Set MySpouse = New PersonClass
MySpouse.Name = "Fanny Hill"
If MySpouse.IsUnique() Then
MySpouse.Insert
End If
看起来像是一个矫枉过正的将与个人(这里称为方法和属性)相关的代码块,函数和变量封装成一个类,并使你的代码更明显你正在使用一个使用该类模板的变量(也就是该类的实例)
典型示例:IP地址算法.....(添加IP,查找基址或广播地址,在各种掩码表示法之间进行转换,检查两个重叠范围,找到两个或更多IP-es等的网络掩码等等等等。在十几个应用程序中需要:编写一次类模块,经过测试,您可以轻松地重复使用它。
类的另一个优点是,在VBA编辑器中输入代码时,代码完成会告诉您可以使用类完成的操作(即所有属性和方法都显示在下拉列表中) - 这是您的一种安慰有程序和功能(它们只告诉你参数的名称和类型)
足够?
答案 1 :(得分:2)
我认为简短的回答是属性是类的特征,而方法(子例程)是动作。
我对此的解释是,属性是“形容词”,方法是“动词”。我们可以做一个类比来帮助说明这一点:我们有两个NHL守门员(让我们创建他们作为clsGoalie的成员),Carey Price和Dustin Tokarski。每个都有一个特定于他们独特的“守门员”对象的属性,我们称之为保存百分比(pSavePercentage)。两个守门员都需要完全相同的方法来停止网上射击(比如说私人子拦截射击),但是它们的独特属性会影响该动作的表现。
为什么我们要定义具有属性而不是返回值的类的特征的答案是属性扩展对象,或者实质上是定义对象。返回值不能用于引用它们所源自的对象。回到我们的守门员比喻......让我们假设我们用子程序定义了每个守门员的保存百分比。我们可以使它工作,但在我们的main方法中需要更多的代码。首先,我们必须'Dim SavePercentage As Double'(已经可以看到我们已经走出了我们的对象)。接下来,'SavePercentage = Price.calcSavePercentage'。最后,我们必须编写一个全新的方法(在我们的Main或其他模块中),然后我们将新的double类型的变量传递给...这一点我们甚至不知道谁在网中。价格是保存那个镜头还是托卡尔斯基?混乱。在这种情况下,如果我们将保存百分比设为“clsGoalie”类的属性,我们将更好地利用OOP的强大功能:清洁代码和封装。
希望这有点帮助。
答案 2 :(得分:1)
属性适用于类。所以我猜你真正的问题是:“为什么要使用类模块?”。事实上,您可以在没有这种需求的情况下多年构建出色的应用程序 我开始将它们用于非常特定的用途,例如读取复杂的文本文件(具有跨越多条物理线的逻辑记录的大型机打印报告)或从庞大而复杂的Excel工作表中获取特定信息。 一旦你完成了一个模拟你想要阅读的项目的课程,你可以重复使用从app到app的那个类,并专注于你特定应用程序的逻辑,而不是那个旧文件的逻辑,例如相同的旧文件,例如
答案 3 :(得分:0)
此外,Let / Get组合或Set / Get组合为参数的类型(对于Let / Set)和返回值(Get)设置了规则,以便可以在赋值语句的左侧使用函数。使编码更清晰!