【发布时间】:2013-12-19 10:15:35
【问题描述】:
关于Excel VBA的一个简单问题:如果“Sheets”对象是一个集合,为什么下面这句话返回false? (在中间面板输入)
debug.print TypeOf Sheets Is Collection
Falso
我发现它是因为我创建了一个以 Collection 作为参数的函数。该函数适用于我声明为 Collection 的变量,但不适用于其他集合(例如 Sheets 集合)。
也许 VBA 在继承和/或多态性方面失败了?
编辑:正如 JosieP 和我所解释的那样,Sheets 集合不继承自 Collection 类/接口,因此它不是一个集合,并且不能多态地用作集合.
所以现在的问题是:为什么 Sheets 不是 Collection 的子类?为什么他们没有从 Collection 继承?考虑到表格中已经实现的方法/属性,这应该是小菜一碟。如我所见,Collection 类/接口只需要 4 个方法:
Add
Count
Item
Remove
而且 Sheets 已经实现了 4 个类似的方法/属性:
Add
Count
Item
Delete
所以映射将是微不足道的。他们可以轻松地将表格集合转换为集合。
编辑 2:感谢 mehow 关于询问 MS 的建议,但我不会这样做,因为他们可能会说“这不是设计错误,而是一项功能”: )。更多思考:在新工作簿中运行以下代码:
Sheets.Add.name = "sh2"
Sheets.Add.name = "sh3"
Dim col As Collection
Set col = New Collection
col.Add Sheets(1)
col.Add Sheets(2)
col.Add Sheets(3)
For Each ele In col
Debug.Print "ele in col: " & ele.name
Next ele
For Each ele In Sheets
Debug.Print "ele in Sheets: " & ele.name
Next ele
奇怪的是,“col”和“Sheets”都可以以相同的方式进行迭代,使用“for each”循环,但它们不共享一个通用接口。如果我必须设计类,层次结构将是:
iIterable (interface)
|
|
iCollection (interface)
/ \
/ \
/ \
Collection cSheets (classes)
Sheets 将是 cSheets 类的对象(实例)。
这样,我创建的函数(当前采用 Collection 参数)将采用 iCollection 参数,因此它既可以与 Collection 实例一起使用,也可以与 Sheets 一起使用。
【问题讨论】:
-
我不确定您对“为什么?”的期望是什么。 Sheets 类既不继承自 VBA Collection,也不实现 Collection 接口(例如,没有 Remove 方法)
-
您的问题现在只能由负责的编程团队来回答 ;-)
标签: excel vba inheritance collections polymorphism