热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

将类设置为PublicNotCreatable的潜在后果是什么?

如何解决《将类设置为PublicNotCreatable的潜在后果是什么?》经验,为你挑选了1个好方法。

假设我有一个TestClass具有以下定义的类:

Option Explicit

Public x As Variant

我希望在工作簿打开时创建此类的实例,并在其他工作簿事件中使用.所以在ThisWorkbook模块中,我添加:

Public tc As TestClass

Private Sub Workbook_Open()

Set tc = New TestClass
tc.x = "abc"

End Sub

当我编译它时,我收到一个错误:

Private object modules cannot be used in public object modules as 
parameters or returns types for public procedures, as public data 
members, or as fields of public user defined types

我可以通过转到属性窗口TestClass并将Instancing设置为来解决此问题PublicNotCreatable.看起来这并没有影响类的行为或我在这个VBA项目中的各种函数中创建它的本地实例的能力.更改此Instancing设置是否存在任何潜在问题?



1> Dick Kusleik..:

PublicNotCreatable是可以在不同的VBProject中使用该类的.NotCreatable部分意味着无论VBProject托管什么,该类都必须创建任何新实例并将其传递给其他VBProject.另一个VBProject无法自己创建它们.

你想要做的是Public tc As TestClass在一个标准模块中,让你的班级实例私密.在标准模块中声明变量public会使该变量在项目中的任何位置都可用.

您所做的是创建Workbook对象的ThisWorkbook实例的自定义属性.ThisWorkbook是一个类模块(表单模块和用户表单也是如此).那些类模块是特殊的,因为它们有一个用户界面组件(工作簿,工作表和表单),但它们都是类模块.您可以像在自定义类中一样在ThisWorkbook中定义属性和方法.那就是你做的.您创建了一个名为自定义属性tc.

要在类中创建属性,可以使用Property Get/Let或Public.使用Public的快捷方式看起来很像在标准模块中声明一个公共变量,但它并不完全相同.

那么为什么会出错呢?当您的自定义类实例是另一个类的属性时,VBA将不允许您创建自定义类的实例,因为您可能最终得到子类而没有父类.

因此,请保持您的实例私有,并在标准模块中声明您的公共变量.我有一个名为MGlobals的特殊模块,我保存所有公共变量.如果我有一对以上,我可能做错了什么.


推荐阅读
author-avatar
手机用户2502910101
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有