Scala 中组合与继承的深入解析
1. override 修饰符的使用
在 Scala 里,当子类中定义的成员覆盖了父类的具体成员时,需要使用 override
修饰符。例如在 LineElement
类中, width
和 height
的定义就带有 override
修饰符。这一规则为编译器提供了有用信息,有助于避免一些难以发现的错误,让系统的演进更加安全。
若不小心拼写错误方法名或者意外使用了不同的参数列表,编译器会给出错误信息。示例如下:
$ scalac LineElement.scala
.../LineElement.scala:50:
error: method hight overrides nothing
override def hight = 1
在系统演进方面, override
约定更为重要。假设定义了一个 2D 绘图方法库并公开使用,后续版本中想在基类 Shape
里添加一个新方法 def hidden(): Boolean
,用于绘图方法判断形状是否需要绘制。但这可能会破坏客户端代码,因为客户端可能已经定义了 Shape
的子类,且对 hidden
有不同的实现。
在 Scala 中,客户端最初实现 hidden