【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

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:27726

评论

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

Spark SQL和DataFrames:内置数据源简介(四)

数据与智能

spark sparksq

JDBC数据库链接的那些事

卢卡多多

JDBC 7月日更

Python 正则表达式急速入门

喵叔

7月日更

模块-6 拆分电商系统为微服务

小遵

极光开发者周刊【No.0716】

极光JIGUANG

🐧【Linux技术专题系列】「必备基础知识」一起探索(用户、用户组与文件权限)

洛神灬殇

Linux 操作系统 linux 文件权限控制 7月日更

Liunx之chown命令

入门小站

Linux

架构实战营第二周作业——微信朋友圈高性能复杂度

发酵的死神

架构实战营

【Flutter 专题】84 图解自定义 ACEWave 波浪 Widget (二)

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 7月日更

golang解析---进程,线程,协程

en

线程 进程 协程 Go 语言 goroutine

【通证经济】价值、应用、市场,被掩盖的区块链宝藏!!

CECBC

毕业1年,凭借一份 “漫画” 杀进大厂?他是怎么做到的?原理篇+框架篇

Java架构师迁哥

2021年网络安全市场全景图,看看都有哪些企业吧!

郑州埃文科技

分布式事务最经典的七种解决方案

叶东富

数据库 分布式事务 微服务 TCC Go 语言

昇腾AI的三级跳

脑极体

hdfs中抽象为block块的好处

五分钟学大数据

hdfs 7月日更

Spark :: 源代码(前传)—Spark多线程 :: NettyRpcEnv.ask解读

dclar

spark 多线程 Spark调优 源代码

🐧【Linux技术专题系列】「必备基础知识」一起探索(su、sudo等相关身份提权/身份切换机制)

洛神灬殇

Linux linux 文件权限控制 7月日更 Linux身份提权

我佛了!花重金求来的并发编程笔记,颠覆了我以往“正确“的认知

Java 编程 程序员

如何通过代码审计从三层内网各种漏洞拿到域控?

网络安全学海

黑客 网络安全 信息安全 安全漏洞 渗透测试·

模块2作业

Tina

架构实战营 模块二 作业

一雄

作业 架构实战营 模块二

Ping Exporter -- Prometheus

耳东@Erdong

Prometheus ping 7月日更 exporter

要性能还是要模型?

escray

学习 极客时间 7月日更 如何落地业务建模

架构实战营模块二作业

王晓宇

一文搞懂二分查找面试

泽睿

算法 二分查找

有趣的SVG、Favicon

devpoint

favicon SVG 7月日更

深入了解Spring之MessageSource

邱学喆

MessageFormat MessageSource MessageSourceAware

终于学完了阿里P8大牛推荐的527页Java性能优化实践文档

Java 编程 架构 面试

Discourse 调整使用不同的表情符号

HoneyMoose

5分钟速读之Rust权威指南(四十二)高级函数

wzx

rust

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