50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

VB 中动态编程的技巧和挑战:多重分派

  • 2007-06-20
  • 本文字数:1777 字

    阅读完需:约 6 分钟

随着 VBx 对动态编程的更多支持计划,现在来讨论 Visual Basic 中已经存在的动态属性是个不错的时机。这一部分,我们讨论多重分派(Multiple Dispatch)。

多重分派,也就是我们常说的多重方法,是一个和函数重载相关的技术。主要的不同是时间的选择。在使用重载函数时,编译器决定在编译时调用哪个函数,看下面的代码:

<span>Option</span> <span>Strict</span> <span>On<span color="#000000"><br></br></span></span><span>Module</span> Module1<p><span>Sub</span> Main()</p><br></br><span>Dim</span> obj <span>As</span> A<br></br><span>If</span> Console.ReadKey.KeyChar = <span>"A"</span> <span>Then<br></br></span> obj = <span>New</span> A<br></br><span>Else<br></br></span> obj = <span>New</span> B<br></br><span>End</span> <span>If<br></br></span> Console.WriteLine(Foo(obj))<br></br> Console.ReadLine()<p><span>End</span> <span>Sub</span> <span>Function</span> Foo(<span>ByVal</span> value <span>As</span> A) <span>As</span> <span>String<br></br></span> <span>Return</span> <span>"Function A Object Type "</span> + value.RealName()</p><br></br><span>End</span> <span>Function</span> <span>Function</span> Foo(<span>ByVal</span> value <span>As</span> B) <span>As</span> <span>String<br></br></span> <span>Return</span> <span>"Function B Object Type "</span> + value.RealName()<br></br><span>End</span> <span>Function<p>End</p></span> <span>Module<p>Class</p></span> A<br></br><span>Public</span> <span>Overridable</span> <span>Function</span> RealName() <span>As</span> <span>String<br></br></span> <span>Return</span> <span>"A"<br></br></span> <span>End</span> <span>Function<br></br>End</span> <span>Class<br></br>Class</span> B<br></br><span>Inherits</span> A<br></br><span>Public</span> <span>Overrides</span> <span>Function</span> RealName() <span>As</span> <span>String<br></br></span> <span>Return</span> <span>"B"<br></br></span> <span>End</span> <span>Function<br></br>End</span> <span>Class<br></br></span>运行代码,你要么看到“Function A Object Type A”,要么是“Function A Object Type B”。尽管 obj 指向了类型 B 的一个对象,编译器却已经决定了 Foo 的第一个版本会被调用。这种情况有时被称为单一分派,对初级程序员来说,常是一个难理解的概念。

如果做了下面代码中所示的一些改变,那么时间的选择也随之改变,选择会被推迟到运行时。

Option Strict Off 'Change 1 - Late binding is enabled

Sub Main()
Dim obj 'Change 2 - obj is late bound
If Console.ReadKey.KeyChar = “A” Then
obj = New A
Else
obj = New B
End If
Console.WriteLine(Foo(obj))
Console.ReadLine()

End Sub

用这个版本,你会看到“Function A Object Type A”或者“Function B Object Type B”。这种在运行时选择正确函数的能力,就是人们所说的动态分派。

动态分派不仅仅是在支持后绑定(Late Binding)语言中处理重载的一个有趣的前沿话题,它还是处理同质列表(Homogoneous List)的一项有用技术。

让我们假设在一个窗体中,它里面的每个控件类型都有自己的格式函数,你想为所有的控件都设置上定制的格式。例子里包括 FormatControl(TextBox) 和 FormatControl(ListBox)。

使用一个静态类型语言,比如 C#,你须要在窗体的控件集合里通过一个循环调用每个控件的 FormatControl。但是,因为函数是在编译时被选定的,你不得不提供一个称为 FormatControl(control) 的泛型函数。然后这个泛型使用一个巨大的 if/else-if 块来选择要调用的真实函数。

通过使用动态分派,运行时要选定调用哪个版本的 FormatControl 取决于内存里的对象,而不需要 if/else-if 程序块。这儿仍然需要 FormatControl(control),但是它只是一个用于扣住这些控件的空函数。

在依赖动态分派进行编程时,必须使用 Caution(这个编译器选项)。因为选择被推迟到运行时,那时如果没有找到一个合适的重载的话,可能会产生异常。在静态类型语言里这不是一个问题,因为你会收到编译器给出的异常报告。

查看英文原文: VB Tips and Trips: Multiple Dispatch

2007-06-20 22:271201

评论

发布
暂无评论
发现更多内容

直播预告|FeatureStore Meetup V4携手第四范式 & 腾讯 & 微软大咖讲师,共探特征平台实践

星策开源社区

微软 腾讯 Feature Store 特征平台 MLOps

腾讯云大数据平台 TBDS全面升级,加速构建安全可控的大数据生态

科技热闻

数衍科技与超市发达成合作,共同探索数字小票的新应用

科技怪咖

开源一夏 |分布式事务--TCC解决方案

六月的雨在InfoQ

开源 分布式事务 TCC 最终一致性 8月月更

运营小能手看过来,龙蜥社区招募 5 名校园大使!(另兑换功能上线啦)

OpenAnolis小助手

龙蜥社区 礼品 开发者激励 校园大使 贡献兑换

EPPlus - 用于 .NET 的 Excel 电子表格

辣么大

Excel net 8月月更

大数据学习好还是自学的效果好?

小谷哥

Python自学教程4-数据类型学什么

和牛

Python 测试 8月月更

CSDN 报告:阿里云容器服务成为中国开发者首选

阿里巴巴中间件

阿里云 云原生 云原生容器

Python自学教程5-字符串有哪些常用操作

和牛

Python 测试 8月月更

仅用3年!青软集团跃升华为云教育类目伙伴TOP2

科技怪咖

社区疫情防控小程序源码

清风

源码 计算机毕业设计

案例 | 拯救Larrakia

澳鹏Appen

人工智能 数据库 nlp 语音识别 数据标注

有个大神把牛客网的Java面试笔记在GitHub开源了

收到请回复

大数据 架构 语言 & 开发 开发技术

活动预告(29日)|诚邀您参与AWS & 观测云「可观测性体验日」

观测云

风险组件已经升级到最新版本,仍然提示风险,如何快速解决——kaptcha 安全漏洞

墨菲安全

Kaptcha 漏洞修复 开源安全 漏洞检测 开源安全与治理

北京前端培训学习怎么选择

小谷哥

在线医疗 | 眩晕智能语音问诊技术解决方案

擎声科技

RTC 实时音视频 语音通话 在线医疗 擎声Qtt

java程序员培训学习靠谱吗

小谷哥

推荐这几款好用的IDEA插件,一定不要错过

(-0 , +0)

IDEA 插件 8月月更

OceanBase 4.0:当我们谈单机分布式一体化架构时,我们在说什么?

OceanBase 数据库

defi质押dapp智能合约系统开发代码逻辑

开发微hkkf5566

ARMS实践|日志在可观测场景下的应用

阿里巴巴中间件

阿里云 云原生 可观测

A tour of gRPC:08 - gRPC 反射 与 Evans 客户端

BUG侦探

gRPC RPC protocolBuffer

web前端程序员学习靠谱吗?

小谷哥

皮皮APP夏日防溺水公益讲座 联动武汉长江救援队筑建生命安全线

联营汇聚

零基础参加web前端培训薪资怎么样

小谷哥

数字化时代CRM新的发展方向

力软低代码开发平台

一加和OPPO是什么关系?我来揭秘

Geek_8a195c

购物中心的运营保障,数衍科技数据桥接服务系统升级

科技怪咖

VB中动态编程的技巧和挑战:多重分派_.NET_Jonathan Allen_InfoQ精选文章