Tuesday, October 28, 2008

(4)类继承

Ruby和大多数面向对象语言一样,类可以继承。如果你是Java或者C++程序员你一定知道我在说什么。Ruby和Java一样,一个类可以有多个子类,但是一个类只能有一个父类。Ruby中所有的类多是Object类的子类,Ruby1.9中又增加了一个BasicObject,它是Object类的父类。
class Base
attr_accessor :x,:y
def initialize(x,y)
@x,@y=x,y
end

end

class Child <Base
attr_accessor :z
def initialize x,y,z
super(x,y)
@z=z
end

end

c=Child.new(1, 2, 3)


上面的例子中可以看出Ruby使用符号< 来表示类的继承,Ruby中子类会继承父类的所有方法,包括initialize方法也会继承。就像self关键字表示对象本身一样,其中super 关键字表示父类对象。子类会继承父类的所有方法、实例变量、常量和类变量。但是这里有几点区别:
对于类变量来说,子类中如果命名了与父类同名的变量名,那么在调用子类的时候,子类中变量值会覆盖父类中变量值,而对于常量来说,父类中常量不会被子类中的同名常量覆盖,因为他们所在的“域”不同:
class A

@@value=1
def initialize
@x=1
end
def A.vale
@@value
end
def A.x
@x
end
A::LET=1

end
puts A.vale #打印1
class B < A ; @@value=2; B::LET=2; end
puts A.vale #打印2,说明父类的变量值别子类覆盖了。
class C < B;@@value=3;end
puts A.vale #打印3,说明父类的变量值别子类覆盖了。

puts A::LET # 打印1
puts B::LET # 打印2,说明常量没有被覆盖,因为常量之前有类的前缀

No comments: