如何在Scala中正确设置从另一个继承的类?

时间:2012-03-30 01:41:33

标签: scala inheritance

我一直在寻找在线示例和教程,而且我找不到任何解释这个(继承)与java的区别的东西。简单的例子:

class Shape {
String type;
Shape(String type) {
    this.type = type;
  }
...
}

class Square extends Shape {
Square(String name){ 
    Super(name);
  }
....
}

令我困惑的是,在上面的示例中,我需要调用超类来设置'type'变量,以及访问它以告诉我Box对象的类型。在Scala中,如何做到这一点?我知道scala也使用了traits接口,但上面的例子是否完全从scala中省略了?任何人都可以指导我一个好的例子或解释它。我真的很感激。

1 个答案:

答案 0 :(得分:5)

您可以在Scala中编写几乎完全相同的内容,更简洁:

class Shape(var `type`: String)
class Square(name: String) extends Shape(name)

在第一行中,type前面有var的事实使编译器添加了getter和setter(来自the specification中的“5.3 Class Definitions”):

  

如果正式参数声明x : T前面有 val 或    var 关键字,此参数的访问者(getter)定义(第4.2节)隐式添加到类中。 getter引入了类x的值成员c,该成员被定义为参数的别名。如果介绍关键字为 var ,则还会将setter访问者x _=(第4.2节)隐式添加到该类中。

在第二行name前面没有valvar,因此只是一个构造函数参数,在这种情况下我们将传递给{中的超类构造函数{1}}条款。没有为extends添加任何getter或setter,因此如果我们创建name square的实例Square并调用square.name,则无法编译。

另请注意,type是Scala中的关键字,所以我不得不通过上面的定义和示例中的反引号将其包围起来:

  

示例1.1.2 当需要访问Scala中保留字的Java标识符时,反引号括起的字符串是一种解决方案。

您可以阅读许多资源,以获取有关Scala中继承的更多信息。请参阅示例Chapters 4 and 5 of Programming Scala