ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 7974|回复: 11

[求助] VBA 对 类特性的支持

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-1-22 01:03 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:类和类模块
        我部门的系统 有不同版本的系统软件,输出不同格式的TXT 信息。 需要对TXT中的信息处理。   我使用定义了基本类。  并且在子类中使用Implements 继承基本类。  子类中定义了新的函数。 可以用基本类的对象来访问。  但对VBA对类的封装,重载,继承,多态。 的理解都不太好。有没有具体了例子,或说明来描述。VBA对类的支持到底怎么样。那些我们可以做。那些不可以。   希望各位大虾不吝赐教。

TA的精华主题

TA的得分主题

发表于 2013-1-22 01:10 | 显示全部楼层
vba没有继承,因为vb6就没有,非要的话,.net吧

VB6、vba的 Implements 只是继承了个接口而已,具体实现并不会被继承过来,可以使用组合来模拟,没什么意义

点评

“没有继承”,是有前提的。泛泛的讲“没有继承”不准确  发表于 2014-7-13 15:22

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-1-22 01:29 | 显示全部楼层
class a
Function EQOGPRSData(SheetName As String, FreefilesNum As Integer, Row As Long, eqogprs())
End Function

class b
Implements LOG
Function LOG_EQOGPRSData(SheetName As String, FreefilesNum As Integer, Row As Long, eqogprs())
end function


这是我当前的类,及其函数。可以通过CLASS A的对象来访问CLASS B的函数。   
1. 继承了个接口而已,具体实现并不会被继承过来。 如何理解?
2. 那些情况我需要用组合来模拟呢?


TA的精华主题

TA的得分主题

发表于 2013-1-22 08:25 | 显示全部楼层
本帖最后由 yiyiyicz 于 2013-1-22 09:04 编辑

VBA可以支持类,也可以在一定限度中实现面向对象编程
不过,一些概念、思路和代码写法与按流程写VBA代码有些不同。最好看一下VBA高级教程。在网上可以下载

看你的帖子,似乎有些东西不太对
VBA可以实现多态,继承不行。而且只能单层(多层也有实例,但是十分死板)。如果继承、多态是个复杂的结构,可以在添加引用后,用javascript。这个可以实现多层继承和多根继承。只是需要解决怎么在VBA环境下读入、读出、显示语句
还有个不用类模块的办法(用模块),判断“输出不同格式的TXT 信息”,用select case语句。能实现的功能虽然简单些,但从你的帖子看,应该还行

TA的精华主题

TA的得分主题

发表于 2013-1-22 08:27 | 显示全部楼层
本帖最后由 yiyiyicz 于 2013-1-22 11:50 编辑
bedlami 发表于 2013-1-22 01:29
class a
Function EQOGPRSData(SheetName As String, FreefilesNum As Integer, Row As Long, eqogprs())
...


使用Implements,要在下拉框中选,等VBA代码的写法

一个用接口的实例代码
1,插入类模块BaseClass,并在其中写入
Public Sub BaseSub() '虚拟特性,BaseSub在子类中实现
End Sub
2,插入类模块类模块ImpClass1,并在其中写入
Implements BaseClass  '继承特性。即类ImpClass1实现类BaseClass
Private Sub BaseClass_BaseSub()
    MsgBox "嗨!" & vbLf & "这是类ImpClass 1" & vbLf & "继承自BaseClass"
End Sub
3,插入类模块ImpClass2,并在其中写入
Implements BaseClass     '继承特性。即类ImpClass2实现类BaseClass
Private Sub BaseClass_BaseSub()
    MsgBox "嗨!" & vbLf & "这是类ImpClass 2" & vbLf & "继承自BaseClass"
End Sub

最后,在sheet1中写
Sub ClsDemo()
Dim xImp1 As New ImpClass1
Dim xIMp2 As New ImpClass2
Dim xBase As New BaseClass
Set xBase = xImp1  '多态特性
xBase.BaseSub
Set xBase = xIMp2
xBase.BaseSub
Set xBase = Nothing
Set xImp1 = Nothing
Set xIMp2 = Nothing
End Sub
运行ClsDemo 测试代码
也有认为用Implements,可以算作是继承。但是没见过有人能用VBA实现多层继承的
也有尝试用循环遍历来实现多根(单层)继承的
但我没有试过

TA的精华主题

TA的得分主题

发表于 2013-1-22 11:55 | 显示全部楼层
本帖最后由 yiyiyicz 于 2013-1-22 11:59 编辑

用javascript代码实例
继承

Sub zz()
Set sc = CreateObject("scriptcontrol")
sc.Language = "jscript"
'====一个对象包含另一个对象(即它的原型对象)的内部引用
'====原型对象的属性,表现为每个以他为原型的对象的属性
'====换句话就是:javascript对象从它原型处继承属性
s = "function rect(w,h){" & vbNewLine _
    & "this.width=w;" & vbNewLine _
    & "this.height=h;" & vbNewLine _
    & "this.area=function(){return this.width*this.height;}}"
sc.addcode s
sc.executestatement "var r=new rect(1,2);"
cc = sc.eval("r")
sc.executestatement "var a=r.area( );"
cc = sc.eval("a")
Debug.Print cc
End Sub
这段代码直接复制到VBA编辑器中,可以运行

js的继承方式不止这一种
如果情况比较复杂,个人认为还是用jscript比较好

TA的精华主题

TA的得分主题

发表于 2013-1-24 11:24 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 lipton 于 2013-1-24 11:27 编辑

"1. 继承了个接口而已,具体实现并不会被继承过来。 如何理解?"

实现,就是方法或函数的具体语句。

例子:
  1. '基类
  2. Public lngNum As Long

  3. Public Sub mod1()
  4.     '实现
  5.     Dim i As Long
  6.    i= lngNum+ lngNum
  7.     Debug.Print i
  8. End Sub

  9. '接口继承
  10. Implements Class1

  11. Private Property Let Class1_lngNum(ByVal RHS As Long)

  12. End Property

  13. Private Property Get Class1_lngNum() As Long

  14. End Property

  15. Private Sub Class1_mod1()
  16.     '只继承了基类方法签名,不能继承基类的实现
  17.     '“实现” 需要重写
  18. End Sub
复制代码
VBA接口的作用:对象与对象之间,调用者与被调用者之间制定一个规范的链接约定,把变化部分和不变部分隔离,降低对象之间的耦合度。

TA的精华主题

TA的得分主题

发表于 2022-9-14 22:02 | 显示全部楼层
lipton 发表于 2013-1-24 11:24
"1. 继承了个接口而已,具体实现并不会被继承过来。 如何理解?"

实现,就是方法或函数的具体语句。

如果基类有一个属性,并不需要添加到接口类,只需要在基类中单独实现即可。但是,实例化之后,却无法调用该属性,这是什么原因呢?

论坛里讨论接口的贴子很少,想在此请教一下

TA的精华主题

TA的得分主题

发表于 2022-9-16 19:37 | 显示全部楼层
Fungling 发表于 2022-9-14 22:02
如果基类有一个属性,并不需要添加到接口类,只需要在基类中单独实现即可。但是,实例化之后,却无法调用 ...

不太明白你的意思,或者你把代码发上来看看。
这是官方的对Implements 语句的帮助例子:
https://docs.microsoft.com/zh-cn ... 26l%3Dzh-CN%26k%3Dk(vblr6.chm1103517)%3Bk(TargetFrameworkMoniker-Office.Version%3Dv16)%26rd%3Dtrue

或者在vba的代码窗口 选中Implements按F1

TA的精华主题

TA的得分主题

发表于 2022-9-18 08:45 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lipton 发表于 2022-9-16 19:37
不太明白你的意思,或者你把代码发上来看看。
这是官方的对Implements 语句的帮助例子:
https://docs. ...

https://club.excelhome.net/thread-1589945-1-1.html
这是论坛里某位大神关于接口的贴子,但是没写完。我也在下面作了提问。
请问,怎样才能让attendance显式调用出来呢?
使用接口的目的,是让类和接口分离开来。但是这样导致类模块中,没有在接口类中定义的那些属性方法,不能被对象自身调用,这个问题如何解决呢?
望解惑
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-24 05:10 , Processed in 0.036555 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表