`
biyeah
  • 浏览: 201428 次
  • 来自: ...
社区版块
存档分类
最新评论

[转帖]重新认识Ruby的多态和duck type

    博客分类:
  • Ruby
 
阅读更多
多态在Java中是如何定义的?
原文:http://developer.51cto.com/art/200708/54611.htm

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

什么是duck type?

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

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

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

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

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

话不多说,贴代码:

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)。
分享到:
评论

相关推荐

    多态多态多态多态多态多态多态多态

    多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态多态...

    java的编译时多态和运行时多态

    Java 编译时多态和运行时多态 Java 编译时多态和运行时多态是 Java 语言中两个重要的概念,它们都是多态性的实现方式,但它们在实现机制和应用场景上有所不同。 编译时多态 编译时多态是指在编译期根据参数列表的...

    C#继承和多态的应用

    C#继承和多态的应用

    php多态和抽象类,php教程

    通过观看这个视频,学习者可以了解如何声明和使用接口,以及接口如何与多态和抽象类结合,以增强代码的可扩展性和模块化。 最后,"LAMP兄弟连 原创PHP、LAMP视频下载地址列表.html"可能是课程资源的列表,帮助学习...

    多态和接口学习笔记

    在Java编程语言中,多态(Polymorphism)和接口(Interface)是两个核心概念,它们对于理解和构建面向对象程序至关重要。多态性是面向对象编程的三大特性之一,另外两个是封装和继承。接口则提供了类之间的抽象连接...

    10.5 多态、为什么ruby、ruby编码规范.rar

    在Ruby中,多态性的实现主要依赖于方法重写(Method Overriding)、鸭子类型(Duck Typing)和模块(Module)的混入。 2. **Ruby中的方法重写** 在Ruby中,子类可以重写父类的方法,这就是方法重写。这样,当子类...

    类变量、全局变量、实例变量, 多态、为什么ruby、ruby编码规范

    本文将深入探讨Ruby语言中的类变量、全局变量、实例变量,以及多态的概念,并结合Ruby编码规范来阐述如何有效地编写代码。 一、类变量 类变量在Ruby中以`@@`前缀表示,它们是属于类或模块的共享变量,不会被类的...

    C++重点复习题(多态和继承).doc

    C++重点复习题(多态和继承) 本文将对C++重点复习题(多态和继承)进行详细解释,涵盖了编程语言C++的多项重要知识点。 一、编程语言C++的编写步骤 编写C++程序需要经过编辑、编译、连接和运行四个步骤。编辑是...

    Java 学习课件,继承和多态

    继承和多态

    C#第六章 初始继承和多态.pdf

    C#第六章 初始继承和多态.pdfC#第六章 初始继承和多态.pdfC#第六章 初始继承和多态.pdf C#第六章 初始继承和多态.pdfC#第六章 初始继承和多态.pdf

    Java语言中的 覆盖重载和多态

    Java语言中的覆盖重载和多态,方法的多态,类型的多态,多态的优点,覆盖(override)识别标志,方法的重载,构造函数的重载,重载的好处,重载与覆盖的比较,编译时多态和运行时多态

    一个HW 多态题目 一个HW 多态题目

    接着,我们来看多态的两种主要形式:编译时多态和运行时多态。编译时多态通常通过函数重载和运算符重载实现,编译器在编译阶段就能确定调用哪个函数。而运行时多态则是在程序运行时才决定调用哪个函数,这是通过虚...

    C++多态与继承详解

    C++多态与继承详解PPT资源,图文并茂,详细讲解多态和继承

    继承和多态.doc

    继承和多态.doc 多重继承 继承和多态

    C#多态测试C#多态测试C#多态测试

    在这个“C#多态测试”主题中,我们将深入探讨C#中的多态性,包括方法的重载、重写、抽象类和接口,以及虚方法和非虚方法的区别。 一、方法的重载(Overloading) 在C#中,方法的重载是指在同一个作用域内,可以有多...

    浅谈c++的精髓之继承和多态

    浅谈c++的精髓之继承和多态

    java继承和多态ppt

    java 继承和多态PPT教程

    多态代码实例

    在面向对象编程中,多态分为静态多态(编译时多态)和动态多态(运行时多态)。静态多态主要通过函数重载和运算符重载实现,而动态多态则主要依赖于虚函数。 虚函数是在基类中声明的,并且被派生类重写的成员函数。...

    C++和Java多态的区别

    C++和Java多态的区别

    java基础继承封装多态

    在 Java 中,可以通过方法重写和方法重载来实现多态。方法重写是子类继承父类的方法,并提供不同的实现。方法重载是提供多个同名方法,但是参数类型不同。 面向对象的设计 面向对象的设计是 Java 中的一种设计模式...

Global site tag (gtag.js) - Google Analytics