`
dtzq01
  • 浏览: 6528 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

ruby 重载? 重写?

阅读更多
ruby有重载和重写么?
自己学习整理下,希望大家共同探讨。
首先看看在它们在java中的定义:
Java中,重载(overload)和重写(override)是用来表现多态性的两种重要方式。override也有译作“覆盖”、“覆写”。Java中称作“覆写”比较恰当。

    重载方法是指一个类中,方法名相同、参数列表不同的几个方法,调用时根据不同的参数调用不同的方法。方法重载与返回类型无关。

    覆写方法是指子类有一个方法,方法名、参数列表、返回类型与父类的某个方法完全一致。调用时绘调用子类的方法,而屏蔽掉父类的同名方法。需要注意的是,子类覆写的方法,其可访问性一定要强于或等同于,父类被覆写的同名方法。

ruby有重载吗?
先看一个例子,实现一个类属性的可读写:
class A
  def para(a)
    @para = a
  end
  def para
    @para
  end
end
a = A.new
a.para(1)
puts a.para

有错:
>ruby test.rb
test.rb:10:in `para': wrong number of arguments (1 for 0) (ArgumentError)
from test.rb:10
>Exit code: 1
很明显的,ruby用para方法覆盖了para(a)
稍微把para(a)和para方法定义的位置对调一下:
class A
  def para
    @para
  end
  def para(a)
    @para = a
  end
end
a = A.new
a.para(1)
puts a.para

同样有问题:
>ruby test.rb
test.rb:11:in `para': wrong number of arguments (0 for 1) (ArgumentError)
from test.rb:11
>Exit code: 1
为什么会这样呢?
ruby支持可变参数,根本就没有必要定义两个同名的方法,只用在参数上面做文章就好了。
class A
  def para(*a)
    @para = a.first if a.size == 1
    @para
  end
end
a = A.new
a.para(2)
puts a.para

结果:
>ruby test.rb
2
>Exit code: 0
难道这个就是java中的重载在ruby中的实现?

那么重写呢?
看例子:
class A
  def ow
    puts "Father"
  end
end
class B < A
  def ow
    puts "I am!"
  end
end
b = B.new
b.ow

结果:
>ruby test.rb
I am!
>Exit code: 0

但是有个东西就有点纠结了!
class A
  def ow
    puts "Father"
  end
end
class B < A
  def ow(name)
    puts "I am!" + name
  end
end
b = B.new
b.ow("Jack")
b.ow

结果:
>ruby test.rb
test.rb:13:in `ow': wrong number of arguments (0 for 1) (ArgumentError)
from test.rb:13
I am!Jack
>Exit code: 1
在重载的时候时候也提到了,ruby是看"名字”来认识的,后面ow(name)方法已经把ow方法覆盖了!
由上可知,Ruby语言,只有重写(override),没有其它语言具有的严格意义上的重载(overload)
1
3
分享到:
评论
1 楼 yangbinfx 2012-11-19  
这个问题困扰我好久了!“ruby支持可变参数,根本就没有必要定义两个同名的方法,只用在参数上面做文章就好了。 ”这句话让人豁然明白!

相关推荐

    Ruby语言入门教程

    深入面向对象章节将深入探讨对象的重载与重写、父类方法的增强、实例变量、类变量、类方法以及单例方法和访问控制,这些都是面向对象编程的核心要素。 模块、命名空间、糅合(Mix-in)与多重继承是Ruby语言中支持...

    ruby 中文教程 源代码

    - **重载与重写**:在子类中重新定义父类的方法,以适应不同的需求。 #### 六、Ruby高级特性 - **模块**:提供了一种组织代码的方式,可以包含类和方法。 - **混合(Mix-in)**:允许一个类同时拥有多个模块的功能...

    learn_oop_ruby:启动School Ruby OOP教程

    - Ruby中的方法重写和方法重载体现了多态性。 5. 模块(Module): - 模块用于组织代码,提供命名空间,并支持混合(mixin)功能。 - 使用`include`或`extend`关键字将模块的方法引入到类中。 6. 集合与迭代...

    疯狂JAVA讲义

    1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6 1.3.2 Java程序的运行机制和JVM 6 1.4 开发Java的准备 7 1.4.1 安装JDK 8 学生提问:不是说JVM是...

    程序设计语言的OO特性调研报告 1

    Java中,方法的重载(Overloading)和重写(Overriding)是多态的体现,以及接口的实现也是多态的一种形式。 除了这三大特性,面向对象语言还应具备以下性质: 4. 所有预定义类型皆对象(All pre-defined types ...

    javaSE代码实例

    8.6.3 重写与重载的区别 149 8.7 final与继承 149 8.7.1 最终的类 149 8.7.2 最终的方法 150 8.8 abstract与继承 151 8.8.1 抽象的类 151 8.8.2 抽象的方法 152 8.9 基于继承的多态 154 8.10 小结...

Global site tag (gtag.js) - Google Analytics