1、先来看一个类:
class Fruit
#构造方法
def initialize(name, weight)
@name = name;
@weight = weight;
end
#打印MyWife信息
def printInfo
print("name:", @name, " weight:", @weight);
end
end
fruit = Fruit.new("Apple", 2);
fruit.printInfo();
可以看出上类的定义中,其方式与其他高级语言类似,都是在类的定义中增加对方法和变量的定义。都有一个特殊的方法来支持定义对象时的初始化,Ruby为initialize,与其他语言所不同的是定界符及定义方法的关键字和变量类申明。
使用 @将bia
2、类的继承:
咱们再来定义一个类:
class Apple < Fruit
def initialize(name, weight, color)
super(name, weight);
@color = color;
end
end
fruit = Apple.new("Apple", 2, "Red");
fruit.printInfo();
Ruby类继承关键字使用“<”,其含义与java“extends”一致,对父类构造方法的使用及重载父类方法的方式也一致。
3、属性的读取
A、为每个属性写一个方法,类似于Java的getXXX()方法
B、快捷定义读取属性的方法 attr_reader :name, :color将会属性name定义读取方法,与这面代码等效:
def name
@name
end
def color
@color
end
4、属性的赋值:
ruby中使用定义对象赋值方法的方式进行赋值,如:
def duration= (new_duration)(new_duration)
@duration = new_duration
end
其中duration后必须尽更着=号,否则会报语法错误。与读取属性值类似,Ruby提供了快捷的定义属性赋值的方法:
attr_writer :duration
5、类变量和类方法:
A、类变量(以@@开始的变量)含义与java的类静态变量一致,属于被类的所有对象共享的对象。它必须在使用前初始化,且它是私有的。
B、类方法(def ClassName.MethodName)含义与java静态方法一直,不需要定义对象即可使用。
可参见如下程序:
class DealClassV
@@MAX_NUM = 100;
def DealClassV.isTooLarge(number)
if(number > @@MAX_NUM)
print(number, " is larger than ", @@MAX_NUM, "/n");
else
print(number, " is smaller than ", @@MAX_NUM, "/n");
end
end
def add(nubmer)
@@MAX_NUM += nubmer;
print("Now MAX_NUM is: ", @@MAX_NUM, "/n");
end
end
DealClassV.isTooLarge(2);
DealClassV.isTooLarge(122);
obj = DealClassV.new();
obj.add(100);
obj = DealClassV.new();
obj.add(200);
提供一个单例模式的实现,使用类变量
class MyLogger
private_class_method :new
@@logger = nil;
def MyLogger.create
@@logger = new unless @@logger
@@logger
end
end
#(Programming Ruby - 2nd)
看一个比较有意思的例子:
先定义一个Shape类,传入边 的数目和周长
class Shape
def initialize(num_sides, perimeter)
# ...
end
end
后需要改变定义方式,支持三角形和正方形:
class Shape
def Shape.triangle(side_length)
Shape.new(3, side_length*3)
end
def Shape.square(side_length)
Shape.new(4, side_length*4)
end
end
#(Programming Ruby - 2nd)
它是在原来的基础上增加了两个类方法实现的
6、权限
protected、private、public(默认)
7、Variables
可通过dup复制对象,生成新对象,类似于Java的clone:
var1 = "var";
var2 = var1.dup: #复制var1引用指向的对象值,生成新对象,var2引用指向新对象
可通过var1.freeze;冻结对象,类似于java的final