怎样翻译 override 和 overload?

原创 2011年01月19日 20:05:00

 

这两个单词常常被翻译为相同的“重载”,让人混淆,也有说 override 应该被翻译为重写或覆盖。这里有个小提示,因为并不是每个人都上过正规的OO课程,当两个单词都被翻译为“重载”时,它们的读音是不同的:

 

    override:Chong2 Zai3,重新载入

    overload:Zhong4 Zai3,超重装载

 

比如“操作符重载” 应该念为操作符Zhong4载。这里姑且不讨论应该怎样理解"载入"的意思。

 

同名函数根据参数不同而不同,这样我们让一个函数名称具有多种定义,把这种特性描述为“卡车超载”,倒是有几分神似。但是这种特性也很容易使人联想到多态。事实上,维基百科上就把操作符重载的性质描述为一种多态。所以,当提到多态时,你应该知道,多态是一个含义很广的概念。

 

但是override的翻译似乎都不怎么好,”重写“和”覆盖“从词汇上看都显得不那么术语,读的时候就很容易造成不必要的联想。英文 override 显然不是重写 overwrite,也不是覆盖 overlay,它的意思比较像”推翻“,那么为什么不翻译为”推翻“呢?看下面的例子:

 

    ”精灵“类有一个”绘制“的方法。

    “巫婆精灵“继承了”精灵“。

    1. ”巫婆精灵“重写了”绘制方法“。

    2. ”巫婆精灵“覆盖了”绘制方法“。

    3. ”巫婆精灵“推翻了”绘制方法“。

 

比较一下,先看“重写”:”巫婆精灵“重写了”绘制方法“,这不是废话吗?“巫婆精灵”的绘制方法,当然要重写,如果不重写,那岂不是要继承老方法?问题是,你怎样区分这个重写是"override”的重写,还是"non-override"的重写?

 

再看“覆盖”:”巫婆精灵“覆盖了”绘制方法“,好吧,巫婆精灵的“绘制方法”把父类的同名方法给盖住了。是不是有点像,比如说上课时,你在偷偷的看漫画,一旦老师走过来,你就把语文书盖在漫画上。那么,语文书覆盖了漫画:结果是,漫画看不见了!override 的特殊含义是说隐藏原方法使它看不见呢,还是有其它的特指呢?你怎样用“覆盖”来区分 override 和 non-override 的不同呢?你只能说:

 

    虚函数才能被覆盖,非虚函数不能被覆盖。

 

但是为什么呢?请注意这里的覆盖,它必须被理解为术语的“覆盖”才行,但“覆盖”这个单词有它的直观的认知,就是相同的名字被重新定义了。所以,实际上是说:

 

    虚函数才能被“覆盖”,非虚函数不能被“覆盖”。但是所有函数都可以被覆盖。

 

或者:

 

    虚函数才能被“特别覆盖”,非虚函数不能被“特别覆盖”。但是所有函数都可以被普通覆盖。

 

再或者:

 

    虚函数才能被覆盖,非虚函数不能被覆盖。但是所有函数都可以被重写。

 

或者:

 

    虚函数才能被重写,非虚函数不能被重写。但是所有函数都可以被重新自然定义。

 

看了这么多,你现在是否觉得思路逐渐清晰,还是越看越糊涂了?

 

再比较一下:

 

    虚函数才能被推翻,非虚函数不能被推翻。但是所有函数都可以被覆盖,这是显而易见的。

 

并且,可以自然引申开来:

 

    当你覆盖虚函数的时候,虚函数同时被推翻。(overwrite -> override)

 

这样是不是更形象,而且更加符合 override 这个单词的本意?

 


    If the function is non-virtual, nothing can _override_ it. 

    Any member of the derived class with the same name _hides_ it.

    非虚函数不能被推翻。但可以被派生类的同名函数隐匿。

 

如果写成“非虚函数不能被覆盖。但可以被派生类的同名函数隐匿。”这样恐怕难以体会覆盖和隐匿有什么不同了。

 

--

注意:所有函数都可以被覆盖,这可不一定,在 Java 里,final 函数不可覆盖。

 

相关文章推荐

overload and override

  • 2011年12月08日 17:18
  • 37KB
  • 下载

C++ 类成员函数的重载(overload),重写/覆盖(override),隐藏

C++ 类层次中的同名函数,有三种关系: 重载(overload) 重写、覆盖(override) 隐藏(hide,oversee) 重载c++函数重载 相同的范围(在同一个类中) 相同的函数名字,不...

JAVA方法的重载(overload)和覆盖(override)

方法的重载(overload)和覆盖(override)   有的时候,类的同一种功能有多种实现方式,到底采用哪种实现方式,取决于调用者给定的参数。例如我们最常用的System.out.println...

C++学习之多态及重载(overload),覆盖(override),隐藏(hide)的区别

C++编程语言是一款应用广泛,支持多种程序设计的计算机编程语言。我们今天就会为大家详细介绍其中C++多态性的一些基本知识,以方便大家在学习过程中对此能够有一个充分的掌握。   多态性可以简单地概括为...

c++中的覆盖(override)、重载(overload)与隐藏

定义覆盖(override)覆盖(override)指的是子类重定义父类中的虚函数。特征: 分别位于具有继承关系的子类和父类中; 父类中的某个函数带有virtual关键字; 子类中有与之函数名相同、参...

overload与override的区别 太详细了

override(重写,覆盖)  1、方法名、参数、返回值相同。  2、子类方法不能缩小父类方法的访问权限。  3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。  4、存...
  • a431261
  • a431261
  • 2014年06月12日 23:03
  • 287

【C#】重载(overload)与重写(override)

【前言】         重载和重写,他们其实是实现类型多态(同一种方法,不同的对象会产生不同的结果)特性的基本技术之一,两种技术貌似而实质截然不同 【重载】 1、什么是重载         重载其实...

java基础的静态导入,自动装箱,增强for循环以及overload 与override的区别

首先说一说java的静态导入 静态导入,就像类中的静态方法,不需对象就能通过类调用,而静态导入,就是相比与普通的导入,可以忽略掉调用类,直接写方法如下列: impo...
  • henlang
  • henlang
  • 2015年01月14日 00:12
  • 231

C++学习之多态及重载(overload),覆盖(override),隐藏(hide)的区别

C++学习之多态及重载(overload),覆盖(override),隐藏(hide)的区别 C++编程语言是一款应用广泛,支持多种程序设计的计算机编程语言。我们今天就会为大...
  • guyue35
  • guyue35
  • 2015年05月12日 10:51
  • 428
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:怎样翻译 override 和 overload?
举报原因:
原因补充:

(最多只允许输入30个字)