`
jy503160
  • 浏览: 20014 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

转载收藏:ruby的继承

    博客分类:
  • ruby
阅读更多

转自: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

    ### 知识点一:Ruby 语言的起源与设计哲学 **标题与描述解析:** 在标题“松本行弘:Ruby2.0”及描述“松本行弘向大家介绍了如何使用Ruby2.0。”中,我们可以了解到这段演讲或文章主要由Ruby语言的创造者松本行弘...

    Ruby:ruby错误处理教程

    Ruby:ruby错误处理教程

    脚本编程之: ruby_bcyy_jb51.net

    2. **面向对象编程**:Ruby是面向对象的语言,会讲解类、对象、继承、模块(mixins)以及消息传递等概念。 3. **块、Proc和Lambda**:Ruby中的块是代码段,可以与方法一起使用,Proc和Lambda是可存储的代码块,它们...

    编程资源:Ruby 编程的简要介绍.docx

    Ruby支持继承、多态等面向对象编程的基本特性。 - **方法**: 方法是Ruby中执行特定任务的函数。Ruby支持单例方法,即针对特定实例定义的方法,只对该实例有效。 - **代码示例**: ```ruby class MyClass def the_...

    Web开发:Ruby on Rails.pdf

    Web开发:Ruby on Rails.pdf

    Ruby:Ruby模块与包的深入理解与应用

    Ruby:Ruby模块与包的深入理解与应用

    p6df-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程序:ruby selenium Web驱动程序

    Ruby Selenium Web驱动程序是用于自动化Web浏览器操作的强大工具,它允许开发者使用Ruby语言编写脚本来控制浏览器的行为。这个工具主要用于Web应用的测试,但也可以用于其他需要浏览器交互的场景。在Ruby中,...

    驾驭代码的流转:在Ruby项目中使用Git进行版本控制

    Ruby是一种高级、面向对象的编程语言,由日本的Yukihiro "Matz" Matsumoto在1995年创建。Ruby的设计目标是简单直观,同时具有强大的功能,它受到了像Perl、Smalltalk、Eiffel、Ada以及Lisp等语言的启发。 Ruby的...

    模块的力量:Ruby中include与extend的深度解析

    3. **继承**:使用`include`的模块方法可以被子类继承,而`extend`通常不推荐用于继承,因为它主要关注于类级别的行为。 #### 模块的多重包含 Ruby还支持在一个类中包含多个模块。当一个类包含多个模块时,这些...

    从零到英雄:一步步部署你的Ruby on Rails应用

    5. **Mixin模块**:Ruby 允许使用 mixin 模块来为类添加方法,而不需要使用传统的继承。 6. **元编程**:Ruby 支持元编程,可以在运行时修改代码的行为。 7. **RubyGems**:Ruby 有一个强大的包管理器 RubyGems

    Ruby是一种高级编程语言,主要用于Web开发和脚本编写 Ruby的资源主要分为官方文档、社区驱动的资源、学习资源和工具等

    Ruby是一种高级编程语言,主要用于Web开发和脚本编写。Ruby的资源主要分为官方文档、社区驱动的资源、学习资源和工具等。 官方文档 Ruby Documentation:Ruby官方文档,涵盖了语言的所有方面,包括语言特性、标准...

    Ruby 语法. Ruby 是一种开源的面向对象程序设计的服务器端脚本语言

    - **模块与继承**:Ruby 支持模块(Module)的使用,以及单继承机制。 - **块与迭代器**:Ruby 中的块(Block)可以作为参数传递给方法,并且 Ruby 提供了丰富的迭代器(Iterator)支持。 #### 五、Ruby 语言进阶知识点 ...

    Ruby的垃圾处理大师:深入垃圾回收机制

    Ruby是一种高级、面向对象的编程语言,由日本开发者松本行弘(Yukihiro "Matz" Matsumoto)在1995年创建。Ruby语言以其优雅、简洁和强大的功能而受到开发者的喜爱。以下是Ruby的一些关键特点: 1. **面向对象**:...

    探索Ruby的文本匹配神器:正则表达式的全面指南

    Ruby是一种高级的、面向对象的编程语言,由日本开发者松本行弘(Yukihiro "Matz" Matsumoto)在1995年创建。Ruby语言的设计哲学强调了简洁和生产力,它结合了多种编程范式,包括面向对象、命令式、函数式和过程式...

    编程之魂:Ruby中的元编程艺术

    这种方式可以让类继承模块中的方法,而无需通过继承的方式实现。 #### 代码示例 ```ruby module Greeting def say_hello puts "Hello!" end end class Person include Greeting end person = Person.new person...

    ruby依赖包

    这是一个部署ruby运行环境所需的软件包,安装这个包之前需要安装ruby

    Ruby编程之道:探索优雅代码的艺术

    Ruby是一种高级、面向对象的编程语言。它由日本的Yukihiro "Matz" Matsumoto在1995年设计,并于1996年首次发布。Ruby语言以其简洁明了的语法和强大的功能而受到开发者的喜爱。Ruby语言的特点包括: 1. **面向对象**...

    Ruby-:Ruby的基础

    继承(Inheritance)是通过`操作符实现的,多态性(Polymorphism)是其核心特性之一。 6. **模块**:模块(Module)用于封装代码,可以包含方法、常量和类定义。模块还可以用来实现命名空间和混入(Mix-in)功能,...

Global site tag (gtag.js) - Google Analytics