Ruby类的继承
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类的继承的更多相关文章
- ruby 类创建-继承-消息
############################################# #create ruby a class #@符号表示实例变量,相当于java的private 属性 ### ...
- Ruby类
Ruby类 类定义 #!/usr/bin/ruby class Sample def hello puts "Hello Ruby!" end end # 使用上面的类来创建对象 ...
- 雷林鹏分享:Ruby 类和对象
Ruby 类和对象 Ruby 是一种完美的面向对象编程语言.面向对象编程语言的特性包括: 数据封装 数据抽象 多态性 继承 这些特性将在 面向对象的 Ruby 中进行讨论. 一个面向对象的程序,涉及到 ...
- Ruby 类和对象
Ruby 类和对象 Ruby 是一种完美的面向对象编程语言.面向对象编程语言的特性包括: 数据封装 数据抽象 多态性 继承 这些特性将在 面向对象的 Ruby 中进行讨论. 一个面向对象的程序,涉及到 ...
- UML类图(上):类、继承和实现
面向对象设计 对于一个程序员来说,在工作的开始阶段通常都是别人把东西设计好,你来做.伴随着个人的成长,这个过程将慢慢变成自己设计一部分功能来实现,自己实现.如果要自己设计,无论是给自己看,还是给别人看 ...
- 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸
类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...
- (转)Java:类与继承
原文地址: http://www.cnblogs.com/dolphin0520/p/3803432.html 对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础.抽象.封装.继承.多态这四大 ...
- iBatis.net 类的继承extends和懒加载
<resultMaps> <resultMap id="FullResultMap" class="t_c_team_member_permission ...
- python 类定义 继承
0 前言 系统:win7 64bit IDE : python(x,y) 2.7.6.1 IDE集成的解释器:Python 2.7.6 (default, Nov 10 2013, 19:24:18) ...
随机推荐
- iptables实现反向代理
拓扑图 实现目标 公网用户通过Firewall服务器(iptables实现)访问内网http服务 配置 #iptables iptables -t nat -A PREROUTING -p tcp - ...
- TCP/IP详解 笔记十一
域名服务系统(DNS) DNS:名字到IP转换:电子邮件选路信息:分布式数据库 解析器:是通过gethostbyname(3)和gethostbyaddr(3)来实现的 最常用的名字服务器是BIND ...
- Hong Kong Regional Online Preliminary 2016 C. Classrooms
Classrooms 传送门 The new semester is about to begin, and finding classrooms for orientation activities ...
- Python基本数据类型之int
一.int的范围 2.7: 32位:-2^31~2^31-1 64位:-2^63~2^63-1 3.5: 在3.5中init长度理论上是无限的 二.python内存机制 在一般情况下当变量被赋值后,内 ...
- JavaScript杂谈(顺便也当知识积累)
JavaScript版本 JavaScript的普及使得其于1997年正式成为国际标准,其官方名称为ECMAScript 1999年定稿第三版ECMAScript标准,简称ES3 2009年重大改进的 ...
- 深入JVM-性能监控工具
一.Linux下的性能监控工具 1.1 显式系统整体资源使用情况-top命令 top命令的输出可以分为两个部分:前半部分是系统统计信息,后半部分是进程信息. 在统计信息中,第一行是任务队列信息,他的结 ...
- htons
在Windows和Linux网络编程时需要用到的,用来将主机字节顺序转化为网络字节顺序,以Windows下的代码为例: 1 2 #include<winsock2.h> u_shortht ...
- VS2012 error C2664: “std::make_pair”:无法将左值绑定到右值引用
在vs2012(c++)make_pair()改动: C++: template <class T1, class T2> pair<V1, V2> make_pair(T1& ...
- 关于Linux发行版的选择
Linux发行版很多,分为以RedHat为代表的商业发行版和以Debian为代表的免费发行版.前者典型版本有CentOS.Fedora.SUSE等,后者的典型版本有Ubuntu等 CentOS.Ubu ...
- Webpack 之 Loader 的使用
安装 loaders 如果loader在npm里,可以这样安装: $ npm install xxx-loader --save 或者 $ npm install xxx-loader --save- ...