`

ruby的 继承和多态

 
阅读更多
class Person
  def initialize( name,age=18 )
    @name = name
    @age = age
    @motherland = "China"
  end

  def talk
    puts "my name is "+@name+", age is "+@age.to_s
    if @motherland == "China"
      puts "I am a Chinese."
    else
      puts "I am a foreigner."
    end
  end

  attr_writer :motherland

end


class Student < Person
  def talk
    puts "I am a student. my name is "+@name+", age is "+@age.to_s
  end
end

class Worker < Person 
  def talk
    puts "I am a worker. my name is "+@name+", age is "+@age.to_s
  end
end

p3=Student.new("kaichuan",25);p3.talk

p4=Student.new("Ben");p4.talk


p5=Worker.new("kaichuan",30);p5.talk
p6=Worker.new("Ben");p6.talk

Worker 类与 Student 类同样继承自 Person 类,亲缘关系是兄弟,当他们 talk
时,能准确表明自己身份,因为他们都重写了各自的 talk方法。 不同的子类继承一个父类,不仅子类和父类的行为有变异,而且子类彼此的行为也有差异,这就是多态。

用“ < ”表示 Student 类是 Person 类的子类。Person 类的一切,Student 类都能
继承。但是 Student 类重写了 talk 方法,所以我们看到了不同的运行结果。子类继
承父类的时候,除了重写方法;也可以添加一些新的方法;或是增强父类的方法(用
关键字 super指明)。

Ruby语言只支持单继承,每一个类都只能有一个直接父类。这样避免了多继承的复杂度。但同时,Ruby提供了mixin的机制可以用来实现多继承。

可以使用super关键字调用对象父类的方法,当super省略参数时,将使用当前方法的参数来进行调用。

class Base
  def meth(info)
    puts "This is Base #{info}"
  end
end

class Derived < Base
  def meth(info)
    puts "This is derived #{info}"
    super
  end
end

obj1 = Derived.new

obj1.meth("test")

执行结果为:

This is derived test

This is Base test

如果传入的参数被修改再调用super的话,那么将会使用使用修改后的值。

class Base
  def meth(info)
    puts "This is Base #{info}"
  end
end

class Derived < Base
  def meth(info)
    puts "This is derived #{info}"
    info = "over"
    super
  end
end

obj1 = Derived.new

obj1.meth("test")

执行结果为:

This is derived test

This is Base over
分享到:
评论

相关推荐

    Ruby的教程.txt

    继承与多态:掌握Ruby中的继承机制,了解子类如何继承父类的属性和方法,并实现自己的特定功能。同时,学习多态的概念和实现方式。 三、Ruby Web开发框架 Ruby on Rails介绍:了解Ruby on Rails框架的基本概念和...

    Ruby的概要介绍与分析

    它支持类和对象的定义、继承、多态等面向对象的特性,使得开发者能够以面向对象的方式组织和管理代码。 Ruby社区也是一个充满活力的地方,为开发者提供了丰富的资源和支持。从初学者教程到高级编程技巧,从社区论坛...

    Ruby是一种强大而优雅的编程语言,以其简洁的语法、动态性、面向对象编程和丰富的类库而著称 以下是对Ruby的500字资源介绍:

    它支持类和对象的定义、继承、多态等面向对象的特性,使得开发者能够以面向对象的方式组织和管理代码。这种编程方式有助于减少代码的重复和复杂性,提高代码的可维护性和可重用性。 Ruby拥有丰富的标准库和第三方库...

    免费的一本好书关于Ruby学习

    支持类、继承、多态等面向对象概念,并提供了强大的元编程能力。 3. **动态性强**:Ruby 是一种动态类型语言,变量无需事先声明类型,运行时可以动态改变对象的结构和行为。 4. **强大的元编程能力**:Ruby 提供了...

    cells:查看Ruby和Rails的组件

    它们允许适当的OOP,多态生成器,,视图继承,使用Rails帮助器,以捆绑JS,CSS或图像,通过gem或Rails引擎进行简单分发,封装测试,以及。 完整文件 Cells是Trailblazer框架的一部分。 可在项目站点上找到。 单元...

    app-academy-projects:所有 App Academy 项目

    W2D3 类继承异常、错误处理分解为对象继承、多态和 DRY 信息隐藏/封装 W2D4 国际象棋独奏项目及调试 W2D5 RSpec 简介RSpec 语法TDD 测试双打主题并让守卫-rspec 实践评估 第 3 周 W3D1 SQL 基础知识格式化 SQL 代码 ...

    django-typed-models:使用自动类型字段向下转换的多态 django 模型

    它类似于 Ruby on Rails 中的单表继承。 每个对象的实际类型存储在数据库中,当检索到该对象时,它会自动转换为正确的模型类。 根据新的BSD许可获得许可。特征查询集中的模型自动具有正确的类对公共基础进行子类化...

    Ruby语言入门教程

    目录 自序...........................................4.4 继承..................................................................................................................................34 4.5 多态36

    oop4coders:OOP概念在许多编程语言中的实现,因此“少讲多代码”

    形成OOP的四个主要概念是:抽象,封装,继承和多态。 有很多参考文献讨论OOP并解释其概念。 因此,如果您想更深入地研究这种范式,那么这不是您要找的书。 但是,您仍然可以通过观察编程语言如何处理这些概念来掌握...

    介绍Ruby中的模块与混合类型的相关知识

    主要介绍了Ruby中的模块与混合类型的相关知识,包括平常人们常说的多态与继承等相关知识点,需要的朋友可以参考下

    railsgirls-polymorphic-associations-and-single-table-inheritance

    RailsGirls:多态关联和单表继承 此存储库包含名称类似的的基本应用程序。 先决条件 安装了 Ruby 2。 最新版本是 2.1.5,但任何 2.xx 版本都可以。 安装了 Ruby sqlite3 gem。 安装了 Ruby bundler gem。 安装 $ ...

    ChefGenius:用户提交食谱供其他用户使用 Markdown 进行注释。 注释是可评论的

    Rails 后端的多态关联和关注点 用于可注释 UI 的本机 Javascript 和 jQuery 方法。 跨节点和元素的 DOM 遍历 智能新配方表单,根据需要添加空白输入。 S3/Papercip 用于图像存储和上传。 Devise 和 CanCan 分别...

    疯狂JAVA讲义

    1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6 1.3.2 Java程序的运行机制和JVM 6 1.4 开发Java的准备 7 1.4.1 安装JDK 8 学生提问:不是说JVM是...

    Lua 面向对象

    2) 继承:继承的方法允许在不改动原程序的基础上对其进行扩充,这样使得原功能得以保存,而新功能也得以扩展。这有利于减少重复编码,提高软件的开发效率。 3) 多态:同一操作作用于不同的对象,可以有不同的解释...

    Scala程序设计(第2版)

    19.1 一个较为激进的示例:Ruby on Rails框架中的ActiveRecord库 396 19.2 使用动态特征实现Scala 中的动态调用 397 19.3 关于DSL的一些思考 402 19.4 本章回顾与下一章提要 402 第20章 Scala的领域...

    javaSE代码实例

    第8章 继承——多态的支柱 122 8.1 继承概述 122 8.1.1 类之间的关系 122 8.1.2 面向对象中的继承性 124 8.2 类的继承 125 8.3 成员变量的继承与隐藏 126 8.3.1 成员变量的继承规则 126 8.3.2 成员...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

     国内知名的高端IT技术作家,已出版《Spring 2.0宝典》、《基于J2EE的Ajax宝典》、《轻量级J2EE企业应用实战》、《Struts 2权威指南》、《Ruby On Rails敏捷开发最佳实践》等著作。 目录: 第0章 学习Java...

Global site tag (gtag.js) - Google Analytics