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

[转帖]重新认识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++程序需要经过编辑、编译、连接和运行四个步骤。编辑是...

    labview创建多态VI

    创建多态VI在LabVIEW中的实现主要依赖于函数选板(Function Palette)上的数据类型结构(Data Type Structure)。下面将详细介绍如何在LabVIEW中创建和使用多态VI。 1. **定义多态VI的基本结构** 在LabVIEW中,一...

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

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

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

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

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

    ### 面向对象编程与C++中的继承和多态 #### 1. 面向对象编程思想的诞生 面向对象编程(Object-Oriented Programming, OOP)的引入,是为了克服传统面向过程编程的一些局限性。面向过程编程,如C语言,更侧重于按...

    C++和Java多态的区别

    ### C++和Java多态的区别 #### 一、概述 多态是面向对象编程语言中的一个核心特性,它允许程序员能够使用基类的指针或引用指向派生类的对象,并在运行时根据对象的实际类型来选择合适的方法进行调用。这一特性增强...

    C++多态与继承详解

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

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

    Java语言中的覆盖(Override)和重载(Overload)以及多态(Polymorphism)是面向对象编程的重要概念,它们是实现代码复用和灵活性的关键。 **多态性(Polymorphism)** 多态性是Java中一种允许一个接口有多种实现的方式。...

    java继承和多态ppt

    java 继承和多态PPT教程

    继承与多态,重载和重写

    多态有两种主要形式:静态多态(编译时多态)和动态多态(运行时多态)。静态多态主要通过方法重载(Overloading)实现,即在同一个类中创建多个同名但参数列表不同的方法。动态多态则通过方法重写(Overriding)...

    多态代码实例

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

    java基础继承封装多态

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

    java基础_多态

    它主要体现在方法的多态和对象的多态。 一、方法的多态 方法的多态主要体现在子类继承父类后,可以重写(Override)父类的方法。当使用父类引用指向子类对象时,调用的是子类重写后的版本,这就是动态绑定或晚期...

    C++多态技术的实现和反思

    《C++多态技术的实现和反思》一文深入探讨了C++中多态特性的实现原理及其在实践中的应用与局限性。多态作为面向对象编程的核心特性之一,允许程序在运行时根据对象的实际类型调用相应的成员函数,从而提高了代码的...

Global site tag (gtag.js) - Google Analytics