您的位置:首页 > 编程语言 > Ruby

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: