一、普通方式的继承
Ruby只支持单继承
ruby 代码
- class Child < Father
- ......
- end
Object是所有类的始祖,并且Object的实例方法对ruby的所有对象都是可用的。
super的使用:
1、在initialize中使用super,将调用其父类的initialize方法
2、在一般的实例方法中使用,将调用其父类中同名的方法。
向一个对象发送调用方法时,ruby的本质过程如下:
1、ruby将检查该对象所属的类,如果该类实现了该方法,就运行该方法
2、如果该类没有实现该方法,ruby将找到其直接父类中的方法,然后是其祖父类,凡此以往追溯整个祖先链
3、如果最终没有找到合适方法,ruby会产生一个特殊的行为,引发异常错误
(注意这里父类,如果该类中include了一个module,则ruby如果在该类中没有找到该方法定义是,会把module当成直接父类)
二、Mixin
这个是ruby提供给模块的功能。类定义中,通过include一个模块。当类使用include后,模块的所有的实例方法(和常量)在该类中就可以使用了。下图显示了类和mixin模块之间的关系其原理是,当一个类包含一个模块时,Ruby创建了一个指向该模块的匿名代理类,并将这个匿名代理插入到实施包含的类中作为其直接超类。代理类中包含有指向模块实例变量和实例方法的引用。这个代理类是唯一指向底层模块:改变模块中某个方法的定义
它将改变所有包含该模块的类。
注意:
1、模块和类的区别在于,模块不能实例化,类不能include
2、如果模块和类不在同一个文件中,如果要使用include,则先使用require,把文件引入。
3、include并不是简单的将模块的实例变量和方法拷贝到类中,而是,它是建立一个由类到所包含模块的引用。如果多个类
引用该模块,都将指向同一个模块。
4、如果有多个include,将依次生成代理类,最后一个include的将是该类的直接超类,依次向上衍生
5、含有include的模块或类定义,可以访问它所包含的常量,类变量和实例方法。如果一个模块被包含,那么模块的常量,类变量,
实例方法都被绑定到该类的一个匿名超类中,类的对象会响应发送给模块实例方法的消息。
6、模块里可以定义一个initialize方法,当创建包括模块的类的对象是,如果满足如下条件之一,那么模块的该方法将被调用
a、类没定义它自己的initialize方法
b、类的initialize方法中调用了super
三、extend使用
通过使用Object#extend将一个模块混合到类中,如果在类中使用extend,模块的方法会变为类方法。其原理如图:
分享到:
- 2007-05-09 17:44
- 浏览 5527
- 评论(0)
- 论坛回复 / 浏览 (0 / 3876)
- 查看更多
相关推荐
当多个类公用很多方法的时候可以将公用方法部分抽取出来,需要的类做相关继承。 例子: 代码如下: class A ”it was a “ C.new.a #=>”it was a “ 2、抽象类 当多个类要继承一个类时,用第一种方法,会遇到一个...
Ruby支持类的继承,允许一个类(子类)继承另一个类(父类)的属性和方法。子类使用`符号指定其父类,如下所示: ```ruby class Student def study puts "I'm studying hard!" end end ``` 在这个例子中,`...
用 Ruby 写的脚本,可以提取 iOS 项目中的类继承关系。 用法: ruby class_hierarchy.rb path_to_iOS_project 抽取出的类关系会在 Ruby 脚本的当前执行目录下生成 Extracted 文件夹,里面是 JSON 格式的结果文件。...
这个Ruby脚本的目的是从iOS项目中提取出类的继承关系,并以JSON格式导出结果文件。利用这个脚本,我们可以便捷地分析一个iOS项目的类结构。 脚本的工作原理是遍历iOS项目中的所有Swift文件,通过解析语法树来找出类...
本篇文章将探讨如何优化Ruby中的继承类实例,以提高代码的可读性和效率。 首先,让我们回顾一下给定的代码片段。在这个例子中,`SubjectMatterExpert` 和 `Administrator` 类都继承自 `User` 类,并且它们都包含了...
类变量在Ruby中以`@@`前缀表示,它们是属于类或模块的共享变量,不会被类的实例所继承。这意味着,所有的类实例都可以访问同一个类变量,但它们之间不会互相影响。例如: ```ruby class MyClass @@class_var = ...
1. Ruby对象模型:Ruby中的每个值都是一个对象,每个对象都有一个类,每个类都继承自Object类。Ruby的对象模型是理解元编程的基础。书中通过组织和解释Ruby对象模型的概念,帮助读者清晰理解Ruby的继承和混入机制。 ...
- **动态性**:Ruby支持运行时修改代码结构,允许开发者在程序运行过程中改变类和方法的行为。 - **元编程能力**:Ruby提供了一种称为元编程的技术,使得程序可以自我修改和自我扩展。 ### 二、Ruby编程基础 #### ...
Ruby教程.chm可能涵盖了Ruby的基础语法、变量、数据类型、控制结构(如条件语句和循环)、函数、类与对象、模块、继承、异常处理等重要内容。此外,它可能还会讲解Ruby中的块、 Proc 和 Lambda,以及Ruby的元编程...
混入允许模块中的方法被其他类直接继承和使用,这是一种不同于Java继承的独特方式。 在错误处理方面,Ruby使用异常(Exception),这一点与Java相同。然而,Ruby鼓励使用异常来控制程序流程,而在Java中,过度使用...
2. 面向对象编程:类与对象、继承、多态、封装、模块等。 3. 高级特性:块(Block)、迭代器(Iterator)、元编程、反射等。 4. 标准库的使用:文件操作、网络编程、正则表达式处理等。 5. Ruby on Rails框架的学习...
1. **模型定义**:你可以定义一个Ruby类并继承自`MongoMapper::Document`,然后使用`key`方法声明属性,这类似于ActiveRecord中的`attr_accessor`。例如: ```ruby class User include MongoMapper::Document ...
1. **创建插件结构**:一个 Logstash 插件通常包含一个 Ruby 类,该类继承自 Logstash 的基础插件类,如 `Logstash::Inputs::Base`、`Logstash::Filters::Base` 或 `Logstash::Outputs::Base`。这些基类提供了事件...
4. **多重继承**:Ruby支持多重继承,一个类可以从多个父类继承属性和方法,从而增强了代码的复用性和扩展性。 ### 核心知识点四:《Programming Ruby》书籍特色 《Programming Ruby》不仅仅是一本技术手册,它更...
Ruby的继承机制允许类从其他类继承属性和方法,从而实现代码重用和结构层次。此外,Ruby还支持模块(Module),它们可以包含方法和常量,且可以被多个类混合(Mix-in)以扩展功能。 总之,"ruby程序设计"涵盖了从...
例如,它会详细介绍如何创建和使用类、继承机制、模块混入、块和 Proc 对象,以及符号(Symbol)、字符串(String)、数组(Array)、哈希(Hash)等基本数据类型的使用。核心库的理解对于掌握Ruby语言至关重要。 ...
Ruby的面向对象特性体现在其类和继承机制上。你可以定义自己的类,并通过`class`关键字开始。类可以包含属性(也称为实例变量)和方法。继承允许一个类(子类)继承另一个类(父类)的属性和方法,这样可以实现代码...
一个类可以包含多个模块,实现多重继承的效果。 7. **异常处理**:Ruby提供了异常处理机制,通过`begin..rescue..end`结构捕获和处理运行时错误。 8. **标准库丰富**:Ruby的标准库包含了大量实用的模块和类,如...