Ruby - 重写与重载
Page content
重写(Override)和重载(Overload)是 Java 里面比较强大的特性,可惜却比较笨重。
重写和重载值针对类方法的。
重载与重写
重载定义:
类或者子类中,方法名相同、参数列表不同的方法。
调用时根据参数的不同调用不同的方法,与返回值无关。
重写定义:
子类中,方法名、参数列表、返回值与父类完全一致。
这里完全一致是说子类的方法的可见性、参数类型、返回值类型要强于或者等于
父类的访问性、参数列表、返回值。
事实上,Ruby 和 Python 类似,没有严格意义上的重载定义,只有重写。 也就是说同类或者子类中不允许有同名的方法。那如何完成重载的功能呢?
Java 中重载有三种定义:
1. 参数个数不同, call(int a) 与 call(int a, int b)
2. 参数类型不同, call(int a) 与 call(float b)
3. 参数位置不同, call(int a, string b) 与 call(string a, int b)
而 ruby 和 python 一样使用如下特性来解决重载的问题:
- 缺省参数解决参数个数问题
- 动态参数类型解决参数类型和位置不同问题
- 可变参数也能解决 Java 中的可变参数以及参数问题
例如:
def call(a,b='',c=0,*num)
end
Python 中类似结构为:
def call(a,b='',c=0,*num):
pass
矛和盾总是有冲突的,动态参数类型增强了方法重载的能力,但同时也扩大错误使用的风险。