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:
Post a Comment