继承 & 多态

先说一下关于封装 的一点小东西吧,

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更灵巧的垃圾收集器,当某个实例不再与其它代码交互了,垃圾收集器就回收它占用的系统资源,

这个实例自然也就不存在了。垃圾收集器是一段代码,它作它的工作,自动地、不知疲倦地随着系统一同运作,并无自己的喜恶。

你可能感兴趣的:(java,object,Class,Ruby,语言,accessor)