@[toc]
面向对象
class Box
def initialize(w,h)
@width, @height = w, h
end
end
类用于指定对象的形式。它结合了数据表示和方法,将数据组织成一个整洁的包。类中的数据和方法称为类的成员。
Ruby类定义
定义类时,实际上定义了数据类型的蓝图。这实际上并没有定义任何数据,而是定义了类的名称意味着什么,即类的对象将由什么组成,以及可以对对象执行什么操作。
类定义以关键字class开头,后跟类名,以结尾结尾。例如,我们使用关键字类来定义Box类,如下所示:
class Box
code
end
实例变量是类属性,当使用类创建对象时,这些属性将成为对象的属性。每个对象的属性是单独指定的,不会与其他对象共享值。@operator用于访问类内部的这些属性,而名为accessor方法的公共方法用于访问类外部的这些属性。让我们将上面定义的类Box作为实例,并将@width和@height作为类Box的实例变量。
class Box
def initialize(w,h)
@width, @height = w, h
end
def printWidth
@width
end
def printHeight
@height
end
end
box = Box.new(10, 20)
x = box.printWidth()
y = box.printHeight()
puts "盒子宽度 : #{x}"
puts "盒子高度 : #{y}"
创建对象,初始化盒子的高度与宽度。
控制访问
Ruby为提供了三个级别的实例方法保护:公共、私有或受保护。Ruby不对实例和类变量应用任何访问控制。
公共方法:任何对象都可以调用公共方法。默认情况下,方法是公共的,但initialize方法始终是私有的。
私有方法:不能从类外部访问或查看私有方法。只有类方法才能访问私有成员。
受保护方法:受保护方法只能由类及其子类的对象调用。只能在类及其子类中进行访问。
下面是一个简单的示例,演示这三个修饰符的语法:
Area of the box is : 200
test.rb:42: protected method `printArea' called for #
<Box:0xb7f11280 @height=20, @width=10> (NoMethodError)
类的继承
继承是面向对象编程中最重要的概念之一。继承允许我们基于另一个类定义一个类,这使得创建和维护应用程序更加容易。
继承有助于重用代码并快速执行。不幸的是,Ruby不支持多重继承,但Ruby支持混合。mixin类似于多重继承的特定实现。在多重继承中,只有接口部分是可继承的。
在创建类时,程序员可以直接指定新类继承自现有类的成员,这样就不必从头开始编写新的数据成员和成员函数。现有类称为基类或父类,新类称为派生类或子类。
Ruby还提供了子类化的概念,这意味着继承。下面的示例解释了这个概念。扩展类的语法非常简单。只需在class语句中添加<字符和父类的名称。例如,以下定义BigBox类是Box的子类:
class Box
def initialize(w,h)
@width, @height = w, h
end
def getArea
@width * @height
end
end
class BigBox < Box
def printArea
@area = @width * @height
puts "Big box area is : #@area"
end
end
box = BigBox.new(10, 20)
box.printArea()
有时我们想防止对象被更改。在Object中,冻结方法可以实现这一点。它可以有效地将对象转换为常量。任何对象都可以调用对象冻结。不能修改冻结对象,即不能更改其实例变量。
可以使用对象冻结?方法检查给定对象是否已冻结。如果对象已被冻结,则此方法将返回true;否则,它将返回一个假值。
类常量
通过将直接数值或字符串值赋给变量,可以在类中定义常量。不需要使用@或@@来定义常量。按照惯例,常数的名称是大写的。
一旦定义了常量,就不能更改其值。可以直接访问类内的常量,就像访问变量一样。但如果要访问类外部的常量,则必须使用类名::constant,
class Box
BOX_COMPANY = "TATA Inc"
BOXWEIGHT = 10
def initialize(w,h)
@width, @height = w, h
end
# 实例方法
def getArea
@width * @height
end
end
box = Box.new(10, 20)
a = box.getArea()
puts "Area of the box is : #{a}"
puts Box::BOX_COMPANY
puts "Box weight is: #{Box::BOXWEIGHT}"
Ruby的自我与Java的this相似,但却截然不同。Java方法在实例方法中被引用,因此这通常指向当前对象。Ruby代码逐行执行,因此self在不同的上下文中具有不同的含义。
这意味着可以通过将类作为当前对象来执行类定义。这也意味着元类和父类中的方法在方法定义的执行过程中可用。