ruby 的多态

来源:互联网 发布:阿里云免费网站空间 编辑:程序博客网 时间:2024/06/05 22:35

ruby是一个面向对象的语言,属于面向对象的一些特点肯定都会具备。在java中多态有两种表现方式,一种在一个类中,相同的方法名,参数不相同,另一种是子类和父类中,子类覆盖父类的方法。

1.ruby中有方法的重载吗?

class Box   # constructor method   def initialize(w,h)      @width, @height = w, h   end   # instance method   def getArea      @width * @height   end   def getArea(w,h)      @area = w* h   endendbox = Box.new(6,7);$area1 = box.getAreaputs("one is #$area1")$area2 = box.getArea(8,9);puts("two is #$area2")
这段代码报错,如下:

box.rb:10:in `getArea': wrong number of arguments (0 for 2) (ArgumentError)
        from box.rb:16:in `<main>'

也是调用方法box.getArea传递的参数不对,我们把

$area1 = box.getAreaputs("one is #$area1")
这两行代码注释掉,程序正常,同样我们将getAea(w,h)和方法getAea前后位置换一下,我们需要注释掉下面两行代码才能正常运行,如此看来ruby并不支持方法的重载。

ruby为什么不知道方法的重载呢?

ruby有这样一种特性,它支持方法的参数的可变性

class ParamSample  def sayHello(*names)      puts names.class      puts "Hello #{names.join(",")}!"  end  endps = ParamSample.newps.sayHello #output Array Hello !ps.sayHello("wlb","xqh","ssl") #output Array Hello lee,snake!
从结果看到names.class 是一个Array,我们在加个时间类呢

class ParamSample  def sayHello(*names)      puts names.class      puts "Hello #{names.join(",")}!"  end endps = ParamSample.newtime2 = Time.nowputs "Current Time : " + time2.inspectps.sayHello #output Array Hello !ps.sayHello("wlb","xqh",time2) #output Array Hello lee,snake!
结果和java中的重载几乎没有区别,这是不是就是ruby放弃重载的原因呢??????

2.ruby的覆盖

class Car  def myname     puts "我是一辆车"  end  def run puts "我准备奔跑了"  endendclass Baoma < Cardef myname     puts "我是一辆宝马"  endend car = Baoma.newcar.mynamecar.run

ruby没有没有抽象,没有接口,但在学之前一直听说ruby是多继承的,这又从何而来呢?我想这应该和moudle有关吧!

这个问题留到下午,现在在解决一个小问题。









原创粉丝点击