Ruby快速入门(四):类和模块
2011-07-24 18:37
274 查看
原文地址:http://blog.csdn.net/zhu_xz/article/details/4936800
我在第一篇文章 里简单的提过类和对象,但说得太过简单,所以这里重新再说一遍,也加上了对模块的简单介绍。再重申一遍,在Ruby中,一切都是对象,即便是简单的如1、2、3、4这样的数字都是对象。
下面的代码向我们展示了如何使用类和对象 :
# 定义类
class BaseClass
# 定义accessor
attr_accessor:name
# 构造函数
def initialize(name)
puts "BaseClass::initialize - #{name}"
@name = name
end
# 自定义函数
def printName
puts @name
end
end
# Ruby只支持单继承
class SubClass < BaseClass
def initialize(name)
# 调用父类构造函数
super(name)
puts "SubClass::initialize - #{name}"
end
end
# 创建对象
obj = SubClass.new("obj")
# 调用对象方法
puts obj.name
obj.name = "name changed"
obj.printName
则结果为:
BaseClass::initialize - obj
SubClass::initialize - obj
obj
name changed
Ruby提供了public、protected和private来修饰类成员,其含义与C++相同。但不同的是,在Ruby中,所有类变量都默认 是private的,而类函数都默认是public的。对类成员而言,也可像第4行那样用attr_accessor对其进行修饰,使其可被外部访问。
和C++或Java相比,Ruby中的类具有更大的灵活性,随时随地都可以对类的内容进行修改。
class Original
def fun
puts "original::fun"
end
end
obj = Original.new
obj.fun
class Original
def fun2
puts "original::fun2"
end
end
obj.fun2
另一方面,为了降低程序的复杂度,Ruby只支持单继承,每个类只能有一个父类。但同时为了提高程序的灵活性,Ruby通过模块 为多重继承提供了可能。
Ruby中的模块从某种角度说类似于C++中的namespace,例如:
module Mod
def myFunction
puts "myFunction"
end
module_function :myFunction
class Class
def yourFunction
puts "Mod::Class.yourFunction"
end
end
end
Mod.myFunction
object = Mod::Class.new
object.yourFunction
这段代码定义了一个名为Mod的模块,其中包含一个名为myFunction的函数和一个名为Class的类。然后直接调用函数 myFunction(注意需要声明为module_function),并创建了一个名为object的Mod::Class对象及调用其函数。
通过模块,也能够“实现”多重继承。或者更加准确的说,模块中的类和函数都被mixed-in到了新的类中,所以在Ruby中这又被成为mixin。
module Mod1
def fun1
puts "Mod1::fun1"
end
instance_method :fun1
end
module Mod2
def fun2
puts "Mod2::fun2"
end
instance_method :fun2
end
class Cls
include Mod1
include Mod2
end
obj = Cls.new
obj.fun1
obj.fun2
完
我在第一篇文章 里简单的提过类和对象,但说得太过简单,所以这里重新再说一遍,也加上了对模块的简单介绍。再重申一遍,在Ruby中,一切都是对象,即便是简单的如1、2、3、4这样的数字都是对象。
下面的代码向我们展示了如何使用类和对象 :
# 定义类
class BaseClass
# 定义accessor
attr_accessor:name
# 构造函数
def initialize(name)
puts "BaseClass::initialize - #{name}"
@name = name
end
# 自定义函数
def printName
puts @name
end
end
# Ruby只支持单继承
class SubClass < BaseClass
def initialize(name)
# 调用父类构造函数
super(name)
puts "SubClass::initialize - #{name}"
end
end
# 创建对象
obj = SubClass.new("obj")
# 调用对象方法
puts obj.name
obj.name = "name changed"
obj.printName
则结果为:
BaseClass::initialize - obj
SubClass::initialize - obj
obj
name changed
Ruby提供了public、protected和private来修饰类成员,其含义与C++相同。但不同的是,在Ruby中,所有类变量都默认 是private的,而类函数都默认是public的。对类成员而言,也可像第4行那样用attr_accessor对其进行修饰,使其可被外部访问。
和C++或Java相比,Ruby中的类具有更大的灵活性,随时随地都可以对类的内容进行修改。
class Original
def fun
puts "original::fun"
end
end
obj = Original.new
obj.fun
class Original
def fun2
puts "original::fun2"
end
end
obj.fun2
另一方面,为了降低程序的复杂度,Ruby只支持单继承,每个类只能有一个父类。但同时为了提高程序的灵活性,Ruby通过模块 为多重继承提供了可能。
Ruby中的模块从某种角度说类似于C++中的namespace,例如:
module Mod
def myFunction
puts "myFunction"
end
module_function :myFunction
class Class
def yourFunction
puts "Mod::Class.yourFunction"
end
end
end
Mod.myFunction
object = Mod::Class.new
object.yourFunction
这段代码定义了一个名为Mod的模块,其中包含一个名为myFunction的函数和一个名为Class的类。然后直接调用函数 myFunction(注意需要声明为module_function),并创建了一个名为object的Mod::Class对象及调用其函数。
通过模块,也能够“实现”多重继承。或者更加准确的说,模块中的类和函数都被mixed-in到了新的类中,所以在Ruby中这又被成为mixin。
module Mod1
def fun1
puts "Mod1::fun1"
end
instance_method :fun1
end
module Mod2
def fun2
puts "Mod2::fun2"
end
instance_method :fun2
end
class Cls
include Mod1
include Mod2
end
obj = Cls.new
obj.fun1
obj.fun2
完
相关文章推荐
- Ruby快速入门(四):类和模块
- PP模块快速入门之功能简介(六)
- ruby入门_模块
- Ruby快速入门
- Ruby快速入门(五):字符串和正则表达式
- Spring第二篇【Core模块之快速入门、bean创建细节、创建对象】
- XOOPS模块开发快速入门中文翻译(八)
- PP模块快速入门之功能简介(七)
- 启明星新闻模块权限快速入门
- XOOPS模块开发快速入门中文翻译(六)
- PP模块快速入门之功能简介(八)
- 个人自制maven快速入门及其管理web项目多模块的依赖图文并茂教程
- ThinkPhp新手入门!怎样快速生成模块目录结构?
- Ruby快速入门(三):控制语句
- Ruby 语法快速入门
- Node.js开发指南——第3章安装Node.js快速入门(四)模块和包
- XOOPS模块开发快速入门中文翻译(九)
- 【夯实Ruby基础】Ruby快速入门
- Ruby快速入门(30分钟)
- (多核DSP快速入门)9.IPC的堆模块HeapMP和链表模块ListMP