2013-01-07 162 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