2013-01-07 114 views
1

我是新来的斯卡拉,只是做一些练习; 我想一个很简单的程序,介绍如下:斯卡拉继承与抽象类

abstract class Device(val cds: Array[Char]) { 
    var codes = Array[Char](cds: _*) 
    def encrpt(code: Char): Char 

    var nextDevice: Device 

    def setNext(next: Device):Unit = { 
    nextDevice = next 
    } 
} 

//compiler error shows here 
class Input(codes: Array[Char]) extends Device(codes) { 
    override def encrpt(code: Char) = code 
} 

,你可以看到有在第21行编译错误,以下是消息: 类输入需要抽象的,因为在可变nextDevice类型com.me.acm.problem1009.Device类设备不 定义(请注意,变量需要初始化定义)

我非常混乱的错误,我的理解,定义一些变量和一个setter方法在父类中,所以子类ses可以使用它而无需再次定义它。它很简单。

我想我错过了什么。有人可以向我解释并告诉什么是正确的方式?谢谢。

+0

注意你没有明确声明getter和setter,VAR声明是隐式扩展为getter和setter。请参阅[this](http://www.artima.com/pins1ed/stateful-objects.html#18.2)了解具体成员如何发生这种情况,并且[that](http://www.artima.com/pins1ed/ abstract-members.html#20.4)。 – huitseeker

回答

4

在Scala中,变量没有像在Java(或许多其他语言)中那样使用默认值。因此,当你声明一个变量时,你必须始终指定它的初始值。

在你的代码中,你声明了一个变量nextDevice,但是你没有给它一个值。由于Scala总是需要一个值,因此它会将您写入的内容解释为nextDevice摘要字段,因此编译器告诉您必须重写该值。

如果您更改该行以下,例如,指定一个初始值,则该错误将消失:

var nextDevice: Device = new Input(Array()) 
+0

谢谢,这是非常有帮助的。 – user1484819

3

由于错误消息告诉您,变量nextDevice需要在Input上的构造函数中进行初始化。

class Input(codes: Array[Char]) extends Device(codes) { 
    override def encrpt(code: Char) = code 
    nextDevice = null 
} 

请注意,使用null在斯卡拉不屑一顾。你应该改变你的变量的类型为Option[Device]

+0

非常感谢,现在更清楚。 – user1484819