多态在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 语言中两个重要的概念,它们都是多态性的实现方式,但它们在实现机制和应用场景上有所不同。 编译时多态 编译时多态是指在编译期根据参数列表的...
C#继承和多态的应用
通过观看这个视频,学习者可以了解如何声明和使用接口,以及接口如何与多态和抽象类结合,以增强代码的可扩展性和模块化。 最后,"LAMP兄弟连 原创PHP、LAMP视频下载地址列表.html"可能是课程资源的列表,帮助学习...
在Java编程语言中,多态(Polymorphism)和接口(Interface)是两个核心概念,它们对于理解和构建面向对象程序至关重要。多态性是面向对象编程的三大特性之一,另外两个是封装和继承。接口则提供了类之间的抽象连接...
在Ruby中,多态性的实现主要依赖于方法重写(Method Overriding)、鸭子类型(Duck Typing)和模块(Module)的混入。 2. **Ruby中的方法重写** 在Ruby中,子类可以重写父类的方法,这就是方法重写。这样,当子类...
本文将深入探讨Ruby语言中的类变量、全局变量、实例变量,以及多态的概念,并结合Ruby编码规范来阐述如何有效地编写代码。 一、类变量 类变量在Ruby中以`@@`前缀表示,它们是属于类或模块的共享变量,不会被类的...
C++重点复习题(多态和继承) 本文将对C++重点复习题(多态和继承)进行详细解释,涵盖了编程语言C++的多项重要知识点。 一、编程语言C++的编写步骤 编写C++程序需要经过编辑、编译、连接和运行四个步骤。编辑是...
创建多态VI在LabVIEW中的实现主要依赖于函数选板(Function Palette)上的数据类型结构(Data Type Structure)。下面将详细介绍如何在LabVIEW中创建和使用多态VI。 1. **定义多态VI的基本结构** 在LabVIEW中,一...
C#第六章 初始继承和多态.pdfC#第六章 初始继承和多态.pdfC#第六章 初始继承和多态.pdf C#第六章 初始继承和多态.pdfC#第六章 初始继承和多态.pdf
接着,我们来看多态的两种主要形式:编译时多态和运行时多态。编译时多态通常通过函数重载和运算符重载实现,编译器在编译阶段就能确定调用哪个函数。而运行时多态则是在程序运行时才决定调用哪个函数,这是通过虚...
### 面向对象编程与C++中的继承和多态 #### 1. 面向对象编程思想的诞生 面向对象编程(Object-Oriented Programming, OOP)的引入,是为了克服传统面向过程编程的一些局限性。面向过程编程,如C语言,更侧重于按...
### C++和Java多态的区别 #### 一、概述 多态是面向对象编程语言中的一个核心特性,它允许程序员能够使用基类的指针或引用指向派生类的对象,并在运行时根据对象的实际类型来选择合适的方法进行调用。这一特性增强...
C++多态与继承详解PPT资源,图文并茂,详细讲解多态和继承
Java语言中的覆盖(Override)和重载(Overload)以及多态(Polymorphism)是面向对象编程的重要概念,它们是实现代码复用和灵活性的关键。 **多态性(Polymorphism)** 多态性是Java中一种允许一个接口有多种实现的方式。...
java 继承和多态PPT教程
在面向对象编程中,多态分为静态多态(编译时多态)和动态多态(运行时多态)。静态多态主要通过函数重载和运算符重载实现,而动态多态则主要依赖于虚函数。 虚函数是在基类中声明的,并且被派生类重写的成员函数。...
在 Java 中,可以通过方法重写和方法重载来实现多态。方法重写是子类继承父类的方法,并提供不同的实现。方法重载是提供多个同名方法,但是参数类型不同。 面向对象的设计 面向对象的设计是 Java 中的一种设计模式...
它主要体现在方法的多态和对象的多态。 一、方法的多态 方法的多态主要体现在子类继承父类后,可以重写(Override)父类的方法。当使用父类引用指向子类对象时,调用的是子类重写后的版本,这就是动态绑定或晚期...
《C++多态技术的实现和反思》一文深入探讨了C++中多态特性的实现原理及其在实践中的应用与局限性。多态作为面向对象编程的核心特性之一,允许程序在运行时根据对象的实际类型调用相应的成员函数,从而提高了代码的...
多态分为编译时多态和运行时多态。编译时多态主要通过方法的重载(Overloading)实现,即在同一个类中定义多个同名但参数列表不同的方法。而运行时多态则是通过方法的重写(Overriding)和接口实现实现,它依赖于...