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. iptables实现反向代理

    拓扑图 实现目标 公网用户通过Firewall服务器(iptables实现)访问内网http服务 配置 #iptables iptables -t nat -A PREROUTING -p tcp - ...

  2. TCP/IP详解 笔记十一

    域名服务系统(DNS) DNS:名字到IP转换:电子邮件选路信息:分布式数据库 解析器:是通过gethostbyname(3)和gethostbyaddr(3)来实现的 最常用的名字服务器是BIND ...

  3. Hong Kong Regional Online Preliminary 2016 C. Classrooms

    Classrooms 传送门 The new semester is about to begin, and finding classrooms for orientation activities ...

  4. Python基本数据类型之int

    一.int的范围 2.7: 32位:-2^31~2^31-1 64位:-2^63~2^63-1 3.5: 在3.5中init长度理论上是无限的 二.python内存机制 在一般情况下当变量被赋值后,内 ...

  5. JavaScript杂谈(顺便也当知识积累)

    JavaScript版本 JavaScript的普及使得其于1997年正式成为国际标准,其官方名称为ECMAScript 1999年定稿第三版ECMAScript标准,简称ES3 2009年重大改进的 ...

  6. 深入JVM-性能监控工具

    一.Linux下的性能监控工具 1.1 显式系统整体资源使用情况-top命令 top命令的输出可以分为两个部分:前半部分是系统统计信息,后半部分是进程信息. 在统计信息中,第一行是任务队列信息,他的结 ...

  7. htons

    在Windows和Linux网络编程时需要用到的,用来将主机字节顺序转化为网络字节顺序,以Windows下的代码为例: 1 2 #include<winsock2.h> u_shortht ...

  8. VS2012 error C2664: “std::make_pair”:无法将左值绑定到右值引用

    在vs2012(c++)make_pair()改动: C++: template <class T1, class T2> pair<V1, V2> make_pair(T1& ...

  9. 关于Linux发行版的选择

    Linux发行版很多,分为以RedHat为代表的商业发行版和以Debian为代表的免费发行版.前者典型版本有CentOS.Fedora.SUSE等,后者的典型版本有Ubuntu等 CentOS.Ubu ...

  10. Webpack 之 Loader 的使用

    安装 loaders 如果loader在npm里,可以这样安装: $ npm install xxx-loader --save 或者 $ npm install xxx-loader --save- ...