快速业务通道

冒号和他的学生们(连载15)——数据类型 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
蛙 def shout puts ''呱呱呱'' end def swim puts ''蛙泳'' end end def shoutAndSwim(duck) #让一只会叫会游的家伙边叫边游 duck.shout duck.swim end shoutAndSwim(Duck.new) #让一只鸭边叫边游 shoutAndSwim(Frog.new) #让一只蛙边叫边游

冒号继续讲解:“在Smalltalk、Python和Ruby等动态类型的OO语言中,只要一个类型具有shout和swim的方法,它就可以为shoutAndSwim所接受。在Java这种静态类型语言中是不可能的,除非鸭和蛙在同一继承树上,或者二者均显式实现了一个包含shout和swim的公用接口。”

句号敏锐地指出:“C++是静态类型语言,但它的模板也可实现类似功能,并不需要引入继承关系。”

“非常正确!但请接着看下去。”冒号又放出一段投影——

class Cock                                 #会叫不会游的鸡
    def shout
        puts ''喔喔喔''
    end
end
 
class Fish                               #会游不会叫的鱼
    def swim
        puts ''自由泳''
    end
end
def shoutOrSwim(duck, flag)   #让一只会叫或会游的家伙叫或游
    flag ? duck.shout : duck.swim
end
shoutOrSwim(Cock.new, true)       #让一只鸡叫
shoutOrSwim(Fish.new, false)       #让一只鱼游

“这里鸡没有swim的方法,鱼没有shout的方法。若采用C++的模板,shoutOrSwim是无法通过编译的。但在支持Duck 类型的语言中,只要在运行期间不让鸡swim、让鱼shout——除非你突发奇想——一切平安无事。”冒号作了个OK的手势。

冒号和他的学生们(连载15)——数据类型(3)

时间:2011-07-01 BlogJava 郑晖

“动态类型语言真是越看越可爱。”叹号简直垂涎欲滴了。

“Duck类型为软件重用开启了新的窗口,但凡事都是一分为二的。由于Duck类型的接口组合是隐性的,其使用者需要比普通Interface更小心以避免误用;其维护者也需要更小心以避免破坏客户代码;此外它也可能造成滥用——将会叫会游的东西放进池塘似乎不算坏主意,但如果一艘轮船趁机也开了进来,恐怕就不那么美妙了。”

众皆莞尔。

“再来看看静态类型语言的好处:由于在运行之前进行了类型检查,一方面代码的可靠性增强,另一方面编译器有可能藉此优化机器代码以提高运行效率,同时相比前者节省了运行期的类型检查时间。此外,变量类型的声明表明了编程者的意图,有辅助文档的功效。”冒号解释着,“两种类型的体制可以用两种法律原则来类比:静态类型检查类似‘疑罪从有’的有罪推定制——在被证明合法之前是非法的,动态类型检查类似‘疑罪从无’的无罪推定制——在被证明非法之前是合法的。至于如何取舍,套用一句话:‘Static Typing Where Possible, Dynamic Typing When Needed’。”

问号提出新问题:“动态类型语言与弱类型语言有何不同?”

冒号喟言:“它们也常常被混为一谈,但类型的动静与强弱完全是正交的两个概念。前者以类型的绑定(binding)时间来划分,后者以类型的刚性强度来划分。通常弱类型语言(Weakly-typed Language)允许一种类型的值隐性转化为另一种类型,而强类型语言(Strongly-typed Language)则不允许。举个例子,1+"2"在VB中等于3——第二个字符串转化为整数;在Javascript中等于"12"——第一个整数转化为字符串;在C中则等于一个不定的整数值——第二个字符串作为地址来运算。这样似乎很有趣很方便,但程序容易藏污纳垢

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号