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)
分享到:
相关推荐
深入面向对象章节将深入探讨对象的重载与重写、父类方法的增强、实例变量、类变量、类方法以及单例方法和访问控制,这些都是面向对象编程的核心要素。 模块、命名空间、糅合(Mix-in)与多重继承是Ruby语言中支持...
- **重载与重写**:在子类中重新定义父类的方法,以适应不同的需求。 #### 六、Ruby高级特性 - **模块**:提供了一种组织代码的方式,可以包含类和方法。 - **混合(Mix-in)**:允许一个类同时拥有多个模块的功能...
- Ruby中的方法重写和方法重载体现了多态性。 5. 模块(Module): - 模块用于组织代码,提供命名空间,并支持混合(mixin)功能。 - 使用`include`或`extend`关键字将模块的方法引入到类中。 6. 集合与迭代...
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是...
Java中,方法的重载(Overloading)和重写(Overriding)是多态的体现,以及接口的实现也是多态的一种形式。 除了这三大特性,面向对象语言还应具备以下性质: 4. 所有预定义类型皆对象(All pre-defined types ...
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 小结...