Ruby继承的语法

  1. class DerivedClass < BaseClass
  2. #some stuff
  3. end

< 为继承符号

重写(override) 的概念

有时, 我们希望子类从父类继承来的方法可以做与父类不相同的事情,这就需要在子类中重写方法。例如, 你有一个类名字叫Email继承于类Message,两个类都有send方法,但是Email类的send方法需要有邮件地址和一系列邮件协议,但是Message中的send方法并不知道这些,与其在Email类中添加send_mail方法,而从父类继承的send方法弃之不用, 不如显式的修改send方法以适应Email的需求。

例如:

  1. class Creature
  2. def initialize(name)
  3. @name = name
  4. end
  5.  
  6. def fight
  7. return "Punch to the chops!"
  8. end
  9. end
  10.  
  11. # Add your code below!
  12. class Dragon < Creature
  13. def fight
  14. return "Breathes fire!"
  15. end
  16. end
  17.  
  18. dragon = Dragon.new("dragon")
  19. dragon.fight
  20. --------------------------------------------------
  21. 输出:
  22. "Breathes fire!"

另一方面, 有时子类发现它所需要的继承自父类的方法已经被改写, 不要惊慌, 我们可以直接获取父类的响应方法, 这需要使用super关键字。

语法为:

  1. class DerivedClass < Base
  2. def some_method
  3. super(optional args)
  4. # Some stuff
  5. end
  6. end
  7. end

当你在方法中调用super, 这就是告诉Ruby,在父类中找到与调用super的这个方法同名的函数,如果找到, 那么Ruby将会使用其父类版本的这个方法。

例如:

  1. class Creature
  2. def initialize(name)
  3. @name = name
  4. end
  5.  
  6. def fight
  7. return "Punch to the chops!"
  8. end
  9. end
  10.  
  11. # Add your code below!
  12. class Dragon < Creature
  13. def fight
  14. puts "Instead of breathing fire..."
  15. super
  16. end
  17. end
  18.  
  19. dragon = Dragon.new("w")
  20. dragon.fight
  21. -------------------------------------------------------------------
  22. 输出:
  23. Instead of breathing fire...
  24. "Punch to the chops!"

Ruby不支持多继承。然而Ruby允许使用mixin, 这个我们稍后再讲。

为了程序的安全性, Ruby允许我们显式地对方法进行public或private声明, public方法允许作为接口被调用,private方法则对外界不可见。如果不写public或private,Ruby默认为public。

  1. class Person
  2. def initialize(name, age)
  3. @name = name
  4. @age = age
  5. end
  6.  
  7. public # This method can be called from outside the class.
  8.  
  9. def about_me
  10. puts "I'm #{@name} and I'm #{@age} years old!"
  11. end
  12.  
  13. private # This method can't!
  14.  
  15. def bank_account_number
  16. @account_number = 12345
  17. puts "My bank account number is #{@account_number}."
  18. end
  19. end
  20.  
  21. eric = Person.new("Eric", 26)
  22. eric.about_me
  23. eric.bank_account_number #错误, 调用了私有方法!
  24. -------------------------------------------------------------------------
  25. 输出:
  26. I'm Eric and I'm 26 years old!
  27. private method `bank_account_number' called for #<Context::Person:0x0000000262d930 @name="Eric", @age=26>

用attr_reader, attr_writer读写属性(attribute)

根据前面我们所学,如果想要访问定义在类中的属性,例如,我们想要访问@name实例变量, 我们必须这么写

  1. def name
  2. @name
  3. end

如果我们想要我们想修改@name实例变量,那么我们要这么写:

  1. def name=(value)
  2. @name = value
  3. end

现在不必这么麻烦了。我们可以用attr_reader和attr_writer来读写变量,如下:

  1. class Person
  2. attr_reader :name
  3. attr_writer :name
  4. def initialize(name)
  5. @name = name
  6. end
  7. end

当遇到上面的代码时,Ruby自动地做类似如下的事情:

  1. def name
  2. @name
  3. end
  4.  
  5. def name=(value)
  6. @name = value
  7. end

像变魔术一样, 我们可以随意读写变量了!我们仅仅是把变量(转换为symbol)传给attr_reader和attr_writer

如果你既想read也想write一个变量, 那么还有比使用attr_reader和attr_writer更加简短的办法, 那就是用attr_accessor.

Ruby类的继承的更多相关文章

  1. ruby 类创建-继承-消息

    ############################################# #create ruby a class #@符号表示实例变量,相当于java的private 属性 ### ...

  2. Ruby类

    Ruby类 类定义 #!/usr/bin/ruby class Sample def hello puts "Hello Ruby!" end end # 使用上面的类来创建对象 ...

  3. 雷林鹏分享:Ruby 类和对象

    Ruby 类和对象 Ruby 是一种完美的面向对象编程语言.面向对象编程语言的特性包括: 数据封装 数据抽象 多态性 继承 这些特性将在 面向对象的 Ruby 中进行讨论. 一个面向对象的程序,涉及到 ...

  4. Ruby 类和对象

    Ruby 类和对象 Ruby 是一种完美的面向对象编程语言.面向对象编程语言的特性包括: 数据封装 数据抽象 多态性 继承 这些特性将在 面向对象的 Ruby 中进行讨论. 一个面向对象的程序,涉及到 ...

  5. UML类图(上):类、继承和实现

    面向对象设计 对于一个程序员来说,在工作的开始阶段通常都是别人把东西设计好,你来做.伴随着个人的成长,这个过程将慢慢变成自己设计一部分功能来实现,自己实现.如果要自己设计,无论是给自己看,还是给别人看 ...

  6. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  7. (转)Java:类与继承

    原文地址: http://www.cnblogs.com/dolphin0520/p/3803432.html 对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础.抽象.封装.继承.多态这四大 ...

  8. iBatis.net 类的继承extends和懒加载

    <resultMaps> <resultMap id="FullResultMap" class="t_c_team_member_permission ...

  9. python 类定义 继承

    0 前言 系统:win7 64bit IDE : python(x,y) 2.7.6.1 IDE集成的解释器:Python 2.7.6 (default, Nov 10 2013, 19:24:18) ...

随机推荐

  1. libusb-win32简介~

    libusb-win32简介 libusb-win32 is a port of the USB library libusb (http://sf.net/projects/libusb/) to ...

  2. Io 异常: The Network Adapter could not establish the connection 解决方法

    1.IP错误: 在设置URL时错误,例如:jdbc:oracle:thin:@192.168.1.80:1521:orcl 数据库服务器是否正确:ping 服务器IP是否通畅.ping不通则将URL更 ...

  3. 企业开发中选择logback而不是log4j的理由

    不知道看到这篇文章的Java工程师有没有考虑过这个问题:为什么在企业开发中会选择logback来记录日志,而不是log4j呢? 如果你以前没有考虑过这个问题,那么现在如果让你考虑一下,你可能觉的会是因 ...

  4. 解决Cookie乱码问题

    写了一个cookie的定义和获取,结果我输入中文后,页面报错 报错信息如下: type Exception report message An exception occurred processin ...

  5. NSClassFromString 和 遍历UIView获取她所在的UIViewController的tips

    一.NSClassFromString是NSObjCRuntime.h的方法 FOUNDATION_EXPORT Class __nullable NSClassFromString(NSString ...

  6. JZOJ 1312:关灯问题

    传送门 少见的DP再DP题目.题面不短,但是可以看出来这是一道DP题.而且正解的算法复杂度应该是$O(N^3)$.而且给了部分$O(N^4)$的算法的分.可以看出来要AC是要在DP上加上优化的. 设$ ...

  7. Apache Tomcat目录下各个文件夹的作用

    1.bin:存放各种不同平台开启与关闭Tomcat的脚本文件. 2.lib:存tomcat与web应用的Jar包. 3.conf:存放tomcat的配置文件. 4.webapps:web应用的发布目录 ...

  8. JavaWeb---总结(十三)使用Session防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  9. mybatis int 类型判断<if>

    如果数据类型是integer或者int,也就是数据类型的,在用<if>标签做动态语句的时候 不用判断是否为"''" <if test="sex != n ...

  10. QT的安装和配置及helloqt程序的编写时遇到的问题

    1.如果在Windows下命令行编译和运行.cpp 文件,需要找到合适的命令所在文件夹的目录,把它添加到Windows的环境变量里去,SystemPropertiesAdvance. 如qmake 在 ...