先说一下关于封装 的一点小东西吧,
attr_writer :motherland --》 用来定义对象可以修改 motherland
attr_ reader :motherland --》用来定义对象可以输出 motherland
attr_accessor :motherland --》相当于 attr_ reader and attr_writer
比如一个封装的例子:
class Teacher
def initialize(name, age=20)
@name = name
@age =age
@role = "tea"
end #初始化方法
def talk
puts "my name is " + @name + ", age is " + @age.to_s
if @role == "tea"
puts "I am a teacher!"
else
puts "I am a student!"
end
end
attr_writer:name #设置name可以修改
attr_reader :name #设置name可以被输出
end
继承 : 用“ < ”表示Student类是 Teacher类的子类。Teacher类的一切,Student类都能继承。但是Student类重写了talk方法,所以我们看到了不同的运行结果。子类继承父类的时候,除了重写方法;也可以添加一些新的方法;或是增强父类的方法(用关键字super指明)。
class Student < Teacher
attr_reader :name
def talk
puts "测试继承"
end
end
多态 : 不同的子类继承一个父类 ,不仅子类和父类的行为有变异,而且子类彼此的行为也有差异。
class Worker < Teacher
def talk
puts "I am a worker. my name is "+@name+", age is "[email protected]_s
end # talk方法结束
end # Worker类结束
p5=Worker.new("kaichuan",30);
p5.talk
p6=Worker.new("Ben");
p6.talk
ps:
现在说一说new方法。Person类没有定义new方法,为什么生成Person类的具体实例要用new?
Ruby语言已经定义了一个类Object ,如果你在定义新类的时候,没有指明新类的父类,那么,Ruby解释器认为,新类的父类是Object类。
类Object含有new方法、initialize方法…
只要你不重写这些方法,你就自然在使用类Object的方法。
从这里,我们发现一个有趣的事实:
你写一个类的时候,是在创造一类事物的蓝图;当你new的时候,一个实例就按照蓝图生成了。
蓝图早已设计好了,new的时候就是出生的时刻,那么,何时消亡呢?这里没有C++的析构函数,也没有Java的finalize( ) 方法,
Ruby语言内建了一个比Java更灵巧的垃圾收集器,当某个实例不再与其它代码交互了,垃圾收集器就回收它占用的系统资源,
这个实例自然也就不存在了。垃圾收集器是一段代码,它作它的工作,自动地、不知疲倦地随着系统一同运作,并无自己的喜恶。