写点什么

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

评论

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

设计模式:建造者设计模式

毛佳伟🐳

python实现·十大排序算法之桶排序(Bucket Sort)

南风以南

Python 排序算法 桶排序

产业区块链:产业是本质,区块链是工具

CECBC

新基建 CECBC 区块链技术 中国电子

Vite for Vue 是什么?

꯭🇫꯭

Vue vuejs vite Vue3

关于字符编码那些你应该知道的事情

꯭🇫꯭

Java MySQL emoji utf-8 ASCII

SpringBoot之多模块开发

北漂码农有话说

2020年5月30日 泛型程序设计

瑞克与莫迪

贴吧电纸书资深用户,从7个方面详谈BOOX Poke2上手体验!

DT极客

vue-router 容易被忽视的几个地方

꯭🇫꯭

Vue vuejs vue-router router

写给产品经理的信(6):时间管理

punkboy

极客时间,项目管理 职场 产品经理 时间分配 时间管理

Cassandra可调一致性的使用及原理

老任物联网杂谈

大数据 分布式 Cassandra 可调一致性

JUC整理笔记四之梳理VarHandle(上)

JFound

Java

图片与标题的Ken Burns动效

寇云

CSS css3

Spring Bean生命周期——初始化和销毁

xiaoxi666

Java spring

ARTS-week-1

youngitachi

ARTS 打卡计划 arts

一位测试工程师的自我介绍

姬翔

测试

只需CSS的下拉式导航菜单

寇云

CSS css3

毫无意义的人生唯有编织图案

xyz

恭喜你,赢得了爱情长跑的胜利

小天同学

爱情 兄弟 祝福

终于找到了一篇文章!通俗地讲解计算机工作原理

图灵社区

cpu 存储器 编译器 计算机工作原理

面试都在问的微服务、服务治理、RPC、下一代微服务框架... 一文带你彻底搞懂!

程序员柠檬

微服务 后台开发 架构设计

大厂为什么不招30岁以上程序员,看这篇就够了

金刚小书童

程序员 职业规划 技术管理 职业成长

平台化服务的基石:权限模型设计

孤岛旭日

企业架构 用户权限 数据建模

谈谈控制感(11):这样提升控制感,谁都能做到

史方远

心理 成长

广告的发展历程

子悠

广告 计算广告 广告系统 互联网广告 RTB

如何存储1个二进制位&锁存器的核心和本质

姜海天

计算机 数字逻辑

Spring源码

云淡风轻

spring 源码

Vol.10 Java 25岁了!

pyfn2030

Java jdk 编程语言 Java25周年

Django ListView DetailView等基于类的视图如何添加装饰器?

BigYoung

Python django LiveView 装饰器

【CSS】为什么a标签的伪类选择器要注意书写顺序?

德育处主任

CSS html css3 大前端 Web

不忘初心,继续努力

一周思进

ARTS 打卡计划

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