`

ruby类继承中的方法继承

    博客分类:
  • Ruby
阅读更多
c# 代码
  1. namespace ConsoleApplication1   
  2. {   
  3.     class Test   
  4.     {   
  5.         public static void Main()   
  6.         {   
  7.             B b = new B();   
  8.         }   
  9.     }   
  10.   
  11.     class A   
  12.     {   
  13.         public A()   
  14.         {   
  15.             Console.WriteLine("A");   
  16.         }   
  17.     }   
  18.   
  19.     class B : A   
  20.     {   
  21.         public B()   
  22.         {   
  23.             Console.WriteLine("B");   
  24.         }   
  25.     }   
  26. }  

这段程序的输出结果是
A
B

结果都不陌生,把这段程序用ruby重写

ruby 代码
  1. class A   
  2.   def initialize   
  3.     puts "A"  
  4.   end  
  5. end  
  6.   
  7. class B < A   
  8.   def initialize   
  9.     puts "B"  
  10.   end  
  11. end  

这段程序的输出是B,并非我想像中的
A
B

奇怪么?不奇怪,ruby的类在实例化的时候并不会去主动调用父类中的构造函数,也就是说,父类和子类的关系仅仅在于父类为子类提供一些可使用的方法而已,这些方法实际上放在父类自身的方法表或者父类单例类的方法表中:

ruby 代码
  1. class A   
  2. end  

在上面定义的这个类A的方法表中,没有保存任何方法,它所有的通过A.methods看到的方法,都是通过爬继承树得来的。当收到一个方法调用的消息时,ruby类首先会查找自己的方法表,若方法表中没有,就会沿着继承树向上爬,去祖宗类中去找,所以,当我们调用A.new的时候,就会沿着继承关系到Object,Kernel等里面去找这个new方法和initialize方法,在之前B继承A的例子中就可以看到,因为B本身的方法表中已经具有了initialize这个方法,new调用就不会去爬继承树找A中的initialize方法。

分享到:
评论

相关推荐

    Ruby 方法、类

    模块在Ruby中用于封装相关的类和方法,也可以实现类的多重继承。模块通过`module`关键字定义,使用`include`或`extend`导入到其他类或对象中: ```ruby module MathOperations def add(a, b) a + b end end ...

    用 Ruby 实现的脚本:可以提取 iOS 项目中的类继承关系

    这个Ruby脚本的目的是从iOS项目中提取出类的继承关系,并以JSON格式导出结果文件。利用这个脚本,我们可以便捷地分析一个iOS项目的类结构。 脚本的工作原理是遍历iOS项目中的所有Swift文件,通过解析语法树来找出类...

    Ruby 写的脚本,可以提取 iOS 项目中的类继承关系

    用 Ruby 写的脚本,可以提取 iOS 项目中的类继承关系。 用法: ruby class_hierarchy.rb path_to_iOS_project 抽取出的类关系会在 Ruby 脚本的当前执行目录下生成 Extracted 文件夹,里面是 JSON 格式的结果文件。...

    Ruby类继承、抽象类、类拓展混入、代理类实例

    当多个类公用很多方法的时候可以将公用方法部分抽取出来,需要的类做相关继承。 例子: 代码如下: class A ”it was a “ C.new.a #=&gt;”it was a “ 2、抽象类 当多个类要继承一个类时,用第一种方法,会遇到一个...

    ruby中文文档中心资料

    模块可以包含方法和常量,可以通过`include`关键字将模块的方法引入到类中。 Ruby的标准库非常丰富,提供了许多内置的模块和类,如File用于文件操作,Array和Hash提供数据结构支持,Net模块用于网络编程,如HTTP...

    ruby中英文api

    在Ruby中,API主要体现在类、方法、模块和库的形式上,它们提供了丰富的功能供开发者使用。Ruby的官方API文档详细记录了每种内置类型、类、模块、方法以及它们的使用方式。"ruby中英文api"资料集可能包含了对这些...

    Ruby入门教程中文PDF 附实例

    Ruby还支持模块(Module),可以用来组织代码和实现多继承的效果。此外,Ruby的块(Block)和 Proc 对象让函数式编程变得简单,例如使用`each`方法遍历数组: ```ruby fruits = ["Apple", "Banana", "Cherry"] ...

    ruby 中文文档 必备资料

    在Ruby中,异常类是继承自`StandardError`的,你可以自定义异常类来处理特定类型的错误。 Ruby on Rails是Ruby最著名的Web开发框架,它遵循MVC(模型-视图-控制器)架构模式。这份文档可能也涵盖了Rails的相关内容...

    ruby中文文档.chm

    文档中将详细讲解Ruby的基础语法,如变量声明、控制结构(条件语句、循环)、函数和方法定义等。 Ruby的面向对象特性体现在类和对象的概念上。通过定义类,你可以创建具有特定属性和行为的对象。Ruby支持单继承,但...

    ruby元编程.pdf

    Ruby元编程是Ruby编程语言中的一个重要特色,它指的是Ruby语言允许程序员在运行时对类、方法和变量等进行操作的能力。通过元编程,开发者可以编写出更加简洁、灵活和高效的代码。《Metaprogramming Ruby》这本书深入...

    Ruby优化继承类实例

    在Ruby编程语言中,继承是面向对象编程的一个关键特性,它允许子类继承父类的属性和方法。然而,不恰当的使用继承可能会导致代码重复和维护困难。本篇文章将探讨如何优化Ruby中的继承类实例,以提高代码的可读性和...

    ruby中文教程,从基础到深入的让你学习ruby

    你可以定义方法,创建继承结构,使用模块(module)来实现代码复用和类别混合(mixin),以及利用元编程能力动态地修改类的行为。Ruby的块(block)、 Proc 和 Lambda 是实现回调和高阶函数的关键。 元编程是Ruby的...

    ruby中文手册 chm

    用户指南通常会从基础开始介绍Ruby,包括变量、数据类型、控制结构(如if语句、循环)、函数、类与对象、模块、继承等。此外,还会涉及异常处理、文件操作、正则表达式和字符串处理等内容,这些都是Ruby编程的基础...

    ruby中文教程(源代码)

    - 函数与方法:Ruby中的函数被称为方法,可以定义在类或模块中,支持块(block)和 Proc 对象。 2. **面向对象编程(OOP)** - 类与对象:Ruby是纯面向对象的语言,一切皆对象。你可以创建自定义类来封装数据和...

    Ruby 语言中类与对象简介,入门级语法介绍

    在这个例子中,`Student`类继承了`Person`类,并添加了一个新的实例变量`@grade`以及一个新的方法`study`。`super`方法用于调用父类的`initialize`方法。 #### 总结 通过以上介绍,我们可以看到Ruby作为一种纯粹的...

    ruby语言帮助文档(简体中文)

    Ruby中的类和模块是构建对象的基础,类用于定义对象的结构和行为,模块则用于组织代码和实现多继承。 3. **方法**:Ruby的方法可以看作是对象的行为,可以定义在类、模块或者对象上。方法调用可以用点操作符(`.`)...

    Ruby语言中文教程.rar

    多态性在Ruby中通过消息传递实现,即对象调用方法,如果该方法不存在,会尝试在父类中查找。 Ruby中的控制结构包括条件语句(如`if`、`unless`)、循环(如`for`、`while`、`until`、`times`)和块(用`do..end`或`...

    实例讲解Ruby使用设计模式中的装饰器模式的方法

    总的来说,Ruby 中的装饰器模式是一种强大的设计模式,它允许我们在运行时动态地改变对象的行为,增加了代码的灵活性和可扩展性,同时避免了因频繁继承而导致的类爆炸问题。在面向对象编程中,尤其是在需要扩展已有...

    ruby中文 文档

    3. **方法**:Ruby中的方法是实现功能的代码块,可以有参数,也可以返回值。文档会介绍如何定义、调用方法,以及块(block)和 Proc 对象。 4. **异常处理**:Ruby提供了异常处理机制,通过`begin-rescue-end`块来...

    类变量、全局变量、实例变量, 多态、为什么ruby、ruby编码规范

    类变量在Ruby中以`@@`前缀表示,它们是属于类或模块的共享变量,不会被类的实例所继承。这意味着,所有的类实例都可以访问同一个类变量,但它们之间不会互相影响。例如: ```ruby class MyClass @@class_var = ...

Global site tag (gtag.js) - Google Analytics