dd

Scala开发教程(36): 组合和继承–使用override修饰符

jerry Scala 2015年11月25日 收藏

在前面的例子LineElement使用了override来修饰width和height成员变量,在Scala中需要使用override来重载父类的一个非抽象成员,实现抽象成员无需使用override,如果子类没有重载父类中的成员,不可以使用override修饰符。
这个规则可以帮助编译器发现一些难以发现的错误,可以增强系统安全进化。比如,如果你把height拼写错误为hight,使用override编译器会报错

root@mail:~/scala# scalac demo.scala 
demo.scala:13: error: method hight overrides nothing
  override def hight = 1
               ^
one error found

这个规则对于系统的演讲尤为重要,假设你定义了一个2D图形库。你把它公开,并广泛使用。库的下一个版本里你想在你的基类Shape里增加一个新方法:

def hidden(): Boolean

你的新方法将被用在许多画图方法中去决定是否需要把形状画出来,这将可以大大提高系统绘图的性能,但你不可以冒着破坏客户代码的风险做这件事。毕竟客户说不定已经使用不同的hidden实现定义了Shape的子类。或许客户的方法实际上是让对象消失而不是检测是否对象是隐藏的。因为这两个版本的hidden互相重载,你的画图方法将停止对象的消失,这可真不是你想要的!

如果图形库和它的用户是用Scala写的,那么客户的hidden原始实现就不会有override修饰符,因为这时候还没有另外一个使用那个名字的方法。一旦你添加了hidden方法到你Shape类的第二个版本,客户的重编译将给出像下列这样的错误:

.../Shapes.scala:6: error: error overriding method 
		hidden in class Shape of type ()Boolean; 
method hidden needs 'override' modifier 
def hidden(): Boolean =

也就是说,代之以错误的执行,你的客户将得到一个编译期错误,这常常是更可取的。

dd