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

And*_*ndy 0 inheritance scala

我一直在寻找在线和教程的例子,我找不到任何解释这个(继承)与java有什么不同的东西.简单的例子:

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

class Square extends Shape {
Square(String name){ 
    Super(name);
  }
....
}
Run Code Online (Sandbox Code Playgroud)

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

Tra*_*own 5

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

class Shape(var `type`: String)
class Square(name: String) extends Shape(name)
Run Code Online (Sandbox Code Playgroud)

在第一行中,type前面的事实var使编译器添加getter和setter(来自规范 "5.3 Class Definitions" ):

如果形式参数声明x : T前面带有valvar关键字,则此参数的访问器(getter)定义(第4.2节)将隐式添加到类中.getter引入了一个xclass 的value成员,c该成员被定义为参数的别名.如果introduction关键字是var,则setter访问器x _=(第4.2节)也会隐式添加到类中.

在第二行name之前没有valor var,因此只是一个构造函数参数,在这种情况下我们将传递给extends子句中的超类构造函数.没有吸气或setter方法都增加了name,所以如果我们创建一个实例squareSquaresquare.name,它不会编译.

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

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

您可以阅读许多资源,以获取有关Scala中继承的更多信息.例如,参见Programming Scala的第4章和第5章.