Scala开发教程(38): 组合和继承–定义final成员

jerry Scala 2015年11月25日 收藏

在定义类的继承关系时,有时你不希望基类的某些成员被子类重载,和Java类似,在Scala中也是使用final来修饰类的成员。比如在前面的ArrayElement例子,在demo方法前加上final修饰符,

  1. class ArrayElement extends Element {
  2. final override def demo() {
  3. println("ArrayElement's implementation invoked")
  4. }
  5. }

如果LineElement试图重载demo,则会报错:

  1. scala> class LineElement extends ArrayElement {
  2. | override def demo() {
  3. | println("LineElement's implementation invoked")
  4. | }
  5. |
  6. | }
  7. <console>:10: error: overriding method demo in class ArrayElement of type ()Unit;
  8. method demo cannot override final member
  9. override def demo() {
  10.  

如果你希望某个类不可以派生子类,则可以在类定义前加上final修饰符:

  1. final class ArrayElement extends Element {
  2. override def demo() {
  3. println("ArrayElement's implementation invoked")
  4. }
  5. }

此时如果还是重载LineElement的demo函数,则会报错:

  1. scala> class LineElement extends ArrayElement {
  2. | override def demo() {
  3. | println("LineElement's implementation invoked")
  4. | }
  5. |
  6. | }
  7. <console>:9: error: illegal inheritance from final class ArrayElement
  8. class LineElement extends ArrayElement {
  9.