网页教学网
 当前位置: 网页教学网 >> 网络编程 >> JSP编程技术 >> 重新认识ruby的多态和duck type
[ HTML ] [ FW ] [ DW ] [ FP ] [ JS ] [ XML ] [ CSS ] [ 图象 ] [ FLASH ] [ .NET ] [ ASP ] [ JSP ] [ PHP ] [ 数据 ] [ 系统 ] [ 安全 ] [ 素材 ] [ 建站 ] [ 主机 ] [ 入门 ] [ 技巧 ]

重新认识ruby的多态和duck type

http://www.webjx.com  更新日期:2007-08-27 20:49  出处:网页教学网  作者:lgn21st
  多态在java中是如何定义的?

  我这样理解:

  多态需要借助接口来实现,就是所有实现了该特定的接口的类用起来都象他。

  什么是duck type?

  在Programming Ruby中这样定义:如果对象能够象鸭子那样行走,象鸭子那样呱呱叫,那么解释器会很高兴的把它当做鸭子来对待的。(Programming Ruby 中文版 P367)

  一天我问我一个同事,到底ruby中有没有多态?

  得到一个有趣的答复:弱类型的动态语言,没有抽象类,没有接口,你说有没有多态?

  多态很有用,多态是不是只有静态面向对象语言如Java/C#等才有呢?当然不是了,多态OO语言的三大特性之一。

  而Ruby是纯面向对象的语言,Ruby当然有多态。Ruby的多态特性就是它的duck type。

  话不多说,贴代码

  ruby 代码
class SimpleFilter
 attr_reader :fltr_expres
 def initialize(fltr_expres)
 @fltr_expres = fltr_expres
end
def apply_filter(value)
 value.include?(@fltr_expres)
end
end

class RegexFilter
 attr_reader :fltr_expres
 def initialize(fltr_exprs)
 @fltr_expres = fltr_exprs
end
def apply_filter(value)
 value =~ @fltr_expres
end
end

# SimpleFilter和RegexFilter这两个类并不共享一个基类
# 在单元测试中对两个类的实例组成的集合进行迭带
# 简单的调用同名的"apply_filter()"方法就轻松实现了多态
# ruby没有接口,只要方法名匹配,就能轻松的实现了多态特性
require 'test/unit'
class FilterTest < Test::Unit::TestCase
def test_filters
 fltrs = [SimpleFilter.new('oo'), RegexFilter.new(/Go+gle/)]
 fltrs.each do |fltr|
 assert(fltr.apply_filter('I love to Google'))
end
end
end

  在ruby中,class从来(几乎从来)不是type,相反,对象类型是根据对象能作什么决定的,即对象的behavior(method)。

关键词:ruby
推荐给好友】【关闭】【收藏本文
最新五条评论
查看全部评论
评论总数 0
您的评论
用户名: 新注册) 密 码: 匿名:
·用户发表意见仅代表其个人意见,并且承担一切因发表内容引起的纠纷和责任
·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为
站内搜索
相关文章
推荐文章