转自:http://www.cnblogs.com/IAmBetter/archive/2013/03/16/2963680.html
1.先看私有方法能否被继承
class A
@@name = "Anleb"
def ask
puts @@name
end
private :ask
end a= A . new
#a.ask a.send( :ask )
class B < A
end b= B . new
#b.ask b.send( :ask )
|
结论:对于private方法,是被继承的,类变量(类似于静态变量,属于所有实例),也是可以被继承的。
2.看类的方法能否被继承
题外话:private影响谁?
class A
private
def self .ask
puts "class method1"
end
class << self
def play
puts "class method2"
end
end
def tell
puts "instance methods"
end
end A .ask
A .send( :ask )
A .play
A .send( :play )
a= A . new
#a.tell a.send( :tell )
|
结论:可以看到Private只影响实例方法,对类的方法没有影响,要想设定类的private方法,必须在类的单件类中设置。如下
class << self
private
def play
puts "class method2"
end
end
|
进入正题,类的方法是否能继承
class A
private
def self .ask
puts "class method1"
end
class << self
private
def play
puts "class method2"
end
end
def tell
puts "instance methods"
end
end class B < A
end B .ask
B .send( :play )
|
结论:类的方法也是能继承的,如果看过元编程应该知道B的祖先链:B-A-A的单件类-Object-Kernel-BaseObject
3.类本身的实例变量是否能继承
class A
@name = "Anleb"
class << self
attr_accessor :name
end
end p A .name
class B < A
end p B .name
输出: Anleb nil |
结论:说明类的实例变量是不继承的,注意,这里要区别于 类的对象的实例变量。
根据元编程的思路,就是:
对象包含:
对象对类的引用(指针)
对象的实例变量
对象的object_id
对象的状态tainted和frozen状态
类包含:
实例的方法
类变量
因为对象的实例变量是存在于对象中的,所有其他的对象无法从类中获得这个实例变量。
4.super
class A
attr_accessor :ob_name
def initialize
@ob_name = "Anleb"
end
end p A . new .ob_name
class B < A
attr_accessor :ob_id
def initialize
@ob_id = 1
end
end p B . new .ob_name
输出: Anleb nil #这里是Nil,是因为继承了attr_accessor生成的魔法方法
|
说明:这里不要误解了,都说是覆盖了父类A的initialize方法,其实不是的,因为对象调用方法的模式是:先向右-找到自己的类,然后再向上查找自己的祖先类。
这里没有调用父类A的初始化方法,是因为,先找到了自己类B的初始化方法。
如果也继承父类的同名方法呢?利用super
class A
attr_accessor :ob_name
def initialize
@ob_name = "Anleb"
end
def ask
puts "A methods"
end
end p A . new .ob_name
class B < A
attr_accessor :ob_id
def initialize
@ob_id = 1
super
end
def ask
puts "B methods"
super
end
end p B . new .ob_name
B . new .ask
输出: "Anleb" "Anleb" B methods
A methods
|
相关推荐
* Ruby是一种面向对象语言,它支持封装、继承和多态等面向对象的特性。 * Ruby支持代码块和迭代器,使得编写简洁的代码变得更加容易。 * Ruby的语法非常灵活,可以使用多种编程风格编写代码。 * Ruby的核心库非常...
### 知识点一:Ruby 语言的起源与设计哲学 **标题与描述解析:** 在标题“松本行弘:Ruby2.0”及描述“松本行弘向大家介绍了如何使用Ruby2.0。”中,我们可以了解到这段演讲或文章主要由Ruby语言的创造者松本行弘...
Ruby:ruby错误处理教程
2. **面向对象编程**:Ruby是面向对象的语言,会讲解类、对象、继承、模块(mixins)以及消息传递等概念。 3. **块、Proc和Lambda**:Ruby中的块是代码段,可以与方法一起使用,Proc和Lambda是可存储的代码块,它们...
Ruby支持继承、多态等面向对象编程的基本特性。 - **方法**: 方法是Ruby中执行特定任务的函数。Ruby支持单例方法,即针对特定实例定义的方法,只对该实例有效。 - **代码示例**: ```ruby class MyClass def the_...
Web开发:Ruby on Rails.pdf
Ruby:Ruby模块与包的深入理解与应用
p6df-Ruby目录p6df-Ruby徽章概括贡献行为守则变化用法p6df-ruby:p6df-ruby / init.zsh: p6_ruby_prompt_info() p6df :: modules :: ruby :: deps() p6df :: modules :: ruby :: home :: symlink() ...
Ruby Selenium Web驱动程序是用于自动化Web浏览器操作的强大工具,它允许开发者使用Ruby语言编写脚本来控制浏览器的行为。这个工具主要用于Web应用的测试,但也可以用于其他需要浏览器交互的场景。在Ruby中,...
Ruby是一种高级、面向对象的编程语言,由日本的Yukihiro "Matz" Matsumoto在1995年创建。Ruby的设计目标是简单直观,同时具有强大的功能,它受到了像Perl、Smalltalk、Eiffel、Ada以及Lisp等语言的启发。 Ruby的...
3. **继承**:使用`include`的模块方法可以被子类继承,而`extend`通常不推荐用于继承,因为它主要关注于类级别的行为。 #### 模块的多重包含 Ruby还支持在一个类中包含多个模块。当一个类包含多个模块时,这些...
5. **Mixin模块**:Ruby 允许使用 mixin 模块来为类添加方法,而不需要使用传统的继承。 6. **元编程**:Ruby 支持元编程,可以在运行时修改代码的行为。 7. **RubyGems**:Ruby 有一个强大的包管理器 RubyGems
Ruby是一种高级编程语言,主要用于Web开发和脚本编写。Ruby的资源主要分为官方文档、社区驱动的资源、学习资源和工具等。 官方文档 Ruby Documentation:Ruby官方文档,涵盖了语言的所有方面,包括语言特性、标准...
- **模块与继承**:Ruby 支持模块(Module)的使用,以及单继承机制。 - **块与迭代器**:Ruby 中的块(Block)可以作为参数传递给方法,并且 Ruby 提供了丰富的迭代器(Iterator)支持。 #### 五、Ruby 语言进阶知识点 ...
Ruby是一种高级、面向对象的编程语言,由日本开发者松本行弘(Yukihiro "Matz" Matsumoto)在1995年创建。Ruby语言以其优雅、简洁和强大的功能而受到开发者的喜爱。以下是Ruby的一些关键特点: 1. **面向对象**:...
Ruby是一种高级的、面向对象的编程语言,由日本开发者松本行弘(Yukihiro "Matz" Matsumoto)在1995年创建。Ruby语言的设计哲学强调了简洁和生产力,它结合了多种编程范式,包括面向对象、命令式、函数式和过程式...
这种方式可以让类继承模块中的方法,而无需通过继承的方式实现。 #### 代码示例 ```ruby module Greeting def say_hello puts "Hello!" end end class Person include Greeting end person = Person.new person...
这是一个部署ruby运行环境所需的软件包,安装这个包之前需要安装ruby
Ruby是一种高级、面向对象的编程语言。它由日本的Yukihiro "Matz" Matsumoto在1995年设计,并于1996年首次发布。Ruby语言以其简洁明了的语法和强大的功能而受到开发者的喜爱。Ruby语言的特点包括: 1. **面向对象**...
继承(Inheritance)是通过`操作符实现的,多态性(Polymorphism)是其核心特性之一。 6. **模块**:模块(Module)用于封装代码,可以包含方法、常量和类定义。模块还可以用来实现命名空间和混入(Mix-in)功能,...