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 一样使用如下特性来解决重载的问题:

  1. 缺省参数解决参数个数问题
  2. 动态参数类型解决参数类型和位置不同问题
  3. 可变参数也能解决 Java 中的可变参数以及参数问题

例如:

def call(a,b='',c=0,*num)

end

Python 中类似结构为:

def call(a,b='',c=0,*num):
    pass

矛和盾总是有冲突的,动态参数类型增强了方法重载的能力,但同时也扩大错误使用的风险。