VB6 如何实现多重接口继承

三断笛 2009-09-20 11:11:05
加精
直接来代码

'类C1
public sub C()

end Sub

'类C2
Implements C1
public sub C1_C()

end Sub

'C3

Implements C2

'C3要如何实现C2和C1中的接口?

...全文
3563 66 打赏 收藏 转发到动态 举报
写回复
用AI写文章
66 条回复
切换为时间正序
请发表友善的回复…
发表回复
sonic_andy 2010-12-03
  • 打赏
  • 举报
回复
父亲的一个实例->包含父亲的一个实例
sonic_andy 2010-11-26
  • 打赏
  • 举报
回复
[Quote=引用 59 楼 sonic_andy 的回复:]
引用 56 楼 slowgrace 的回复:
...
最后效果,就是通过调用p2.M1,你居然神奇的把从Class1到Class3可以做的事都做了。
...


这是C++中虚(virtual)函数的行为.

如果不加virtual,而让子类的方法覆盖父类方法的话,在VB中可以不递归调用来进行模拟.
也就是说,Class3的p2.M1调用Class2的M1方法就等同于C++的虚函……
[/Quote]

这段话说的有点问题,更正下:
实际上这并不是虚函数而是调用链的行为,即在子类的方法执行完毕后调用父类的方法,这样递归调用.

如果只想让他做一件事情的话,可以不做递归调用.
Class1 爷爷
Class2 父亲 - 包含爷爷的一个实例,实现了爷爷的接口,在爷爷的接口中调用爷爷的相应方法.
Class3 本人 - 父亲的一个实例,实现了父亲和爷爷的接口,父亲的接口中调用父亲自身的方法,爷爷的接口中调用父亲实例中爷爷接口的方法.

这样,Class3(本人)就可以被当作Class2(父亲)和Class1(爷爷)来使用了:)
yangzn76 2010-04-29
  • 打赏
  • 举报
回复
这些并不是说VB不行吧。应该可以用类型库以及HookQI来实现。
sonic_andy 2010-03-11
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 sonic_andy 的回复:]
Implements与聚合配合是可以实现继承功能的.

class1代码:
VB codeOptionExplicitPublicSub M1()
Debug.Print"吃"End Sub
class2代码:
VB codeOptionExplicit
Implements Class1Private mobjClass1AsNew Class1PublicSub M1()Call mobjClass1.M1
Debug.Print"弄死再吃"End SubPrivateSub Class1_M1()Call M1End Sub
class3代码:
VB codeOptionExplicit
Implements Class1Private mobjClass2AsNew Class2PublicSub M1()Call mobjClass2.M1
Debug.Print"烧熟再吃"End SubPrivateSub Class1_M1()Call M1End Sub
窗口代码:
VB codeOptionExplicitPrivateSub Form_Load()Dim clsAsNew Class3Call cls.M1End Sub
[/Quote]

不好意思说错了,今天刚看的COM技术内幕
这种方式应该被称为包容而不是聚合,聚合是指直接将指针给出去的情况.
my13513480001 2010-02-22
  • 打赏
  • 举报
回复
【类的继承】
我都不知道说的什么,占位学习
sonic_andy 2010-01-30
  • 打赏
  • 举报
回复
如果要模拟子类未实现的函数,也可以通过直接调用其模拟父类的方式来实现.
虽然有点麻烦...
sonic_andy 2010-01-30
  • 打赏
  • 举报
回复
说错了,如果模拟普通函数,不是不调用,而是直接调用其模拟父类的相应函数..

Class2代码:
Option Explicit
Implements Class1 ' Class2实现了Class1的默认接口
Private mobjClass1 As New Class1 ' Class2聚合了Class1的一个实例

' 调用基类方法,同时添加自己的内容
Public Sub M1()
Debug.Print "弄死再吃"
End Sub

' 实现基类接口
Private Sub Class1_M1()
Call mobjClass1.M1
End Sub


Class3代码:
Option Explicit
Implements Class1 ' Class3实现了Class1的默认接口
Implements Class2 ' Class3实现了Class2的默认接口
Private mobjClass2 As New Class2 ' Class3聚合了Class2的一个实例

' 调用基类方法,同时添加自己的内容
Public Sub M1()
Debug.Print "烧熟再吃"
End Sub

' 实现基类接口
Private Sub Class1_M1()
Dim objClass1 As Class1
Set objClass1 = mobjClass2
Call objClass1.M1
End Sub

' 实现基类接口
Private Sub Class2_M1()
Call mobjClass2.M1
End Sub
sonic_andy 2010-01-30
  • 打赏
  • 举报
回复
[Quote=引用 56 楼 slowgrace 的回复:]
...
最后效果,就是通过调用p2.M1,你居然神奇的把从Class1到Class3可以做的事都做了。
...
[/Quote]

这是C++中虚(virtual)函数的行为.

如果不加virtual,而让子类的方法覆盖父类方法的话,在VB中可以不递归调用来进行模拟.
也就是说,Class3的p2.M1调用Class2的M1方法就等同于C++的虚函数,不调用的就等用于普通成员函数.
dragronboy 2009-10-07
  • 打赏
  • 举报
回复
不支持的。要自己调用子类中的方法,很累人

*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码)

http://feiyun0112.cnblogs.com/
捧剑者 2009-10-04
  • 打赏
  • 举报
回复
我根本不赞成用聚合代替继承。
在vb6中用聚合模拟继承是没有办法的办法。
我个人的实践是在vb6中根本不使用类模块,而是仍然使用面向过程的编程。
slowgrace 2009-10-03
  • 打赏
  • 举报
回复
[Quote=引用 16 楼, 17 楼 sonic_andy 的回复:]
Implements与聚合配合是可以实现继承功能的.
[/Quote]

你的代码的实质:
(1)用聚合来实现多重继承
(2)用Implements来实现多态。

比较典型的:
Dim p2 As Class2 ' Class2接口
Set p2 = New Class3 ' Class3对象
Call p2.M1

p2.M1实际上调用了p3.M1。调用过程如下:
(1)p2实际上指向一个Class3对象
(2)由于Class3实现了Class2的M1方法,所以多态机制决定对p2.M1会被引向p3里的私有过程Class2_M1
(3)而在Class2_M1过程里你直接调用了Class3的M1方法;
(4)而在Class3的M1方法里你又通过聚合的Class2对象调用了Class2的M1方法;
(5)类似的,在Class2的M1方法中,你也通过聚合的Class1对象调用了Class1的M1方法。

最后效果,就是通过调用p2.M1,你居然神奇的把从Class1到Class3可以做的事都做了。

[Quote=引用 25 楼 modest 的回复:]
Implements只是实现不是派生
[/Quote]
对的,所以实际上它不怎么支持继承。

[Quote=引用 42 楼 tiger_zhao 的回复:]
实现和继承是两种模型,实现的耦合度低容易控制,继承自动化程度高。
[/Quote]
赞同。

[Quote=引用 21 楼 wangmu7206 的回复:]
其实是在用聚合模拟继承。
[/Quote]
记得以前有次讨论,曾经有个结论说,聚合应该全面替代继承。因为继承的耦合度高,会带来一系列麻烦。好像是ahao说的,你也赞同。不知记错没?现在又觉得这个结论有点费解了。
FigoZhu 2009-10-01
  • 打赏
  • 举报
回复
jf
aiwenbupt 2009-09-30
  • 打赏
  • 举报
回复
嗯 谢谢分享
wa_yi 2009-09-30
  • 打赏
  • 举报
回复
VB6只支持单继承。
hutao_000 2009-09-30
  • 打赏
  • 举报
回复
我是新手,学习了
cdcjk 2009-09-29
  • 打赏
  • 举报
回复
学习
ccc_moriya 2009-09-29
  • 打赏
  • 举报
回复
學習。。。。。。。。
eric7566860 2009-09-29
  • 打赏
  • 举报
回复
UP!
编程夜猫 2009-09-29
  • 打赏
  • 举报
回复
C3继承C2,c2继承C1,C3是得不到C1的接口继承的。只有换种方式

C3继承C2,C1的方式可以。

VB6只支持单层继承。
zhang18444 2009-09-29
  • 打赏
  • 举报
回复
关注~~~!
加载更多回复(43)

864

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧