我一直在寻找在线示例和教程,而且我找不到任何解释这个(继承)与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中省略了?任何人都可以指导我一个好的例子或解释它。我真的很感激。
答案 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
前面没有val
或var
,因此只是一个构造函数参数,在这种情况下我们将传递给{中的超类构造函数{1}}条款。没有为extends
添加任何getter或setter,因此如果我们创建name
square
的实例Square
并调用square.name
,则无法编译。
另请注意,type
是Scala中的关键字,所以我不得不通过上面的定义和示例中的反引号将其包围起来:
示例1.1.2 当需要访问Scala中保留字的Java标识符时,反引号括起的字符串是一种解决方案。
您可以阅读许多资源,以获取有关Scala中继承的更多信息。请参阅示例Chapters 4 and 5 of Programming Scala。