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 写的脚本,可以提取 iOS 项目中的类继承关系。 用法: ruby class_hierarchy.rb path_to_iOS_project 抽取出的类关系会在 Ruby 脚本的当前执行目录下生成 Extracted 文件夹,里面是 JSON 格式的结果文件。...
这个Ruby脚本的目的是从iOS项目中提取出类的继承关系,并以JSON格式导出结果文件。利用这个脚本,我们可以便捷地分析一个iOS项目的类结构。 脚本的工作原理是遍历iOS项目中的所有Swift文件,通过解析语法树来找出类...
- **继承**:子类可以从父类继承属性和方法。 - **多态**:不同类的对象可以通过共同接口调用相同的方法,表现出不同的行为。 #### 3.3 封装与抽象 - **封装**:隐藏对象内部的实现细节,只暴露必要的接口。 - **...
4. **多重继承**:Ruby支持多重继承,一个类可以从多个父类继承属性和方法,从而增强了代码的复用性和扩展性。 ### 核心知识点四:《Programming Ruby》书籍特色 《Programming Ruby》不仅仅是一本技术手册,它更...
3. 高度可扩展,可以通过编写扩展库来增加Ruby的功能。 4. 完备的元编程能力,允许开发者在运行时修改程序的行为。 5. 开源,遵循GPL许可证发布,有着庞大的开源社区支持。 6. 提供了丰富的内置库和模块,方便开发者...
总的来说,通过“Ruby教程.chm”和“Ruby程序设计.doc”,你可以系统地学习Ruby语言,理解其基本概念,进阶到高级主题,并能实际编写出高质量的Ruby程序。同时,不要忘记练习是提高编程技能的关键,尝试解决实际问题...
其次,Ruby的语法简洁明了,例如,方法调用可以省略括号,变量声明不需要特定关键字,这使得代码看起来更加简洁。相比之下,Java的语法更显冗长,需要显式声明变量类型。Ruby的“duck typing”概念强调“如果它走...
8. 继承和方法链(Method Chains):Ruby的继承机制和方法链技术使得我们可以构建出流畅的API。方法链允许调用者在一个表达式中连续调用多个方法,这些方法可以属于同一个对象或不同对象。 9. 钩子和回调(Hooks ...
Ruby支持面向对象编程,类、对象、继承、多态等特性一应俱全,同时也提供了函数式编程的一些特性,如高阶函数和块。 在Windows上编写Ruby脚本,可以使用任何文本编辑器,如Notepad++或Visual Studio Code,并保存...
继承允许一个类(子类)继承另一个类(父类)的属性和方法,这样可以实现代码重用和层次结构。子类通过`符号指向父类,如`class Child 。 Ruby还支持模块(Module),它是组织代码的一种方式,可以包含常量、类方法...
### Ruby 教程《The Book of Ruby》知识点总结 #### 一、书籍基本信息 - **书名**:《The Book of Ruby》 ...通过本书的学习,不仅可以掌握Ruby编程的基本技能,还能深入了解其背后的编程思想和设计理念。
一个类可以包含多个模块,实现多重继承的效果。 7. **异常处理**:Ruby提供了异常处理机制,通过`begin..rescue..end`结构捕获和处理运行时错误。 8. **标准库丰富**:Ruby的标准库包含了大量实用的模块和类,如...
Ruby支持单继承,但通过模块,可以实现一种形式的多继承,即混入。模块可以包含方法和常量,可以通过`include`关键字将模块的方法引入到类中。 Ruby的标准库非常丰富,提供了许多内置的模块和类,如File用于文件...
用户指南通常会从基础开始介绍Ruby,包括变量、数据类型、控制结构(如if语句、循环)、函数、类与对象、模块、继承等。此外,还会涉及异常处理、文件操作、正则表达式和字符串处理等内容,这些都是Ruby编程的基础...
- 继承:Ruby支持单继承,但通过模块可以实现多重继承的效果。 - 属性与方法:通过attr_accessor、attr_reader和attr_writer定义属性,方法可以动态添加和删除。 - 构造器:Ruby中的构造器通常是initialize方法,...
它可能包括了Ruby的基础概念,如变量、常量、数据类型、控制流、类和对象的创建、继承、模块的使用、异常处理、文件和I/O操作等内容。同时,也可能涵盖了Ruby的高级特性,如元编程、符号、 Proc对象、块和闭包等。 ...
Ruby中的继承、封装和多态等面向对象概念被充分支持。 3. **动态性**:Ruby的动态性体现在运行时可以改变类、方法和变量的定义,允许动态绑定和鸭子类型。这为开发过程提供了极大的灵活性,但同时也要求开发者具备...
- **继承与多态**:探讨继承机制,以及如何实现多态性来增强代码的灵活性。 - **封装与访问控制**:讲解如何合理地隐藏对象的内部状态,保护数据安全。 5. **异常处理**:介绍异常的基本概念,以及如何使用`begin...
Ruby还支持继承、多态和模块,使得代码可以高度模块化和可复用。 在函数和方法方面,Ruby允许自定义函数和方法,方法可以作为参数传递,也可以返回。块(block)和 Proc 对象是Ruby的独特之处,它们可以用来实现...