Ruby继承的语法

class DerivedClass < BaseClass
#some stuff
end

< 为继承符号

重写(override) 的概念

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

例如:

class Creature
def initialize(name)
@name = name
end def fight
return "Punch to the chops!"
end
end # Add your code below!
class Dragon < Creature
def fight
return "Breathes fire!"
end
end dragon = Dragon.new("dragon")
dragon.fight
--------------------------------------------------
输出:
"Breathes fire!"

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

语法为:

class DerivedClass < Base
def some_method
super(optional args)
# Some stuff
end
end
end

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

例如:

class Creature
def initialize(name)
@name = name
end def fight
return "Punch to the chops!"
end
end # Add your code below!
class Dragon < Creature
def fight
puts "Instead of breathing fire..."
super
end
end dragon = Dragon.new("w")
dragon.fight
-------------------------------------------------------------------
输出:
Instead of breathing fire...
"Punch to the chops!"

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

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

 class Person
def initialize(name, age)
@name = name
@age = age
end public # This method can be called from outside the class. def about_me
puts "I'm #{@name} and I'm #{@age} years old!"
end private # This method can't! def bank_account_number
@account_number = 12345
puts "My bank account number is #{@account_number}."
end
end eric = Person.new("Eric", 26)
eric.about_me
eric.bank_account_number #错误, 调用了私有方法!
-------------------------------------------------------------------------
输出:
I'm Eric and I'm 26 years old!
private method `bank_account_number' called for #<Context::Person:0x0000000262d930 @name="Eric", @age=26>

用attr_reader, attr_writer读写属性(attribute)

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

def name
@name
end

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

def name=(value)
@name = value
end

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

class Person
attr_reader :name
attr_writer :name
def initialize(name)
@name = name
end
end

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

def name
@name
end def name=(value)
@name = value
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. alertDialog创建登陆界面,判断用户输入

    alertDialog创建登陆界面,需要获取用户输入的用户名和密码,获取控件对象的时候不能像主布局文件那样获得, 需要在onClickListener中获取,代码如下: public boolean ...

  2. Scala implicit

    Scala implicit implicit基本含义 在Scala中有一个关键字是implicit, 之前一直不知道这个货是干什么的,今天整理了一下. 我们先来看一个例子: def display( ...

  3. .bash_profile for mac‘ envionment variables

    A typical install of OS X won't create a .bash_profile for you. When you want to run functions from ...

  4. linux修改ip地址的方法

    1. 临时设置ip地址 ifconfig eth0 IP地址 (网络掩码和网关如果不设置就使用默认0) 这种方法只是临时修改,重启网卡或服务器又会还原 2.使用vi编辑器设置 1122.www.qix ...

  5. Linux上性能异常定位以及性能监控

    引言:大多数的服务都是跑在Linux上的,Linux现在也已经到了一个很广泛的应用,但是仍然会有很多问题出现,我们就来讨论下我们性能监控的指标,性能监控无非就是从I/O,内存,CPU,TCP连接数,网 ...

  6. JavaWeb---总结(五)Http协议

    一.什么是HTTP协议 HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的 ...

  7. BZOJ4004: [JLOI2015]装备购买

    总之就是线性基那一套贪心理论直接做就好了. 然而加强数据后很卡精度的样子. 于是重点在于这个特技:在整数模意义下搞. #include<cstdio> #include<algori ...

  8. lunix的查看Tomcat目录下日志的快速操作

    可以使用cd命令,cd命令的功能是切换到指定的目录: 命令格式:cd [目录名] 有几个符号作为目录名有特殊的含义: "/"代表根目录. ".."代表上一级目录 ...

  9. webstorm9.3 安装less 编译css教程

    第一步:安装node.js webstrom9.3汉化下载:http://pan.baidu.com/s/1ntGNNiL    密码:1fbh node.js 下载地址:https://nodejs ...

  10. 模拟退火解决TSP问题

    // monituihuo.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdio.h> #includ ...