2017-04-23 60 views
1

這是一個令我困惑的例子。何時在Scala類中使用覆蓋?

class Point(val xc: Int, val yc: Int) { 
    var x: Int = xc 
    var y: Int = yc 
    def move(dx: Int, dy: Int) { 
     x = x + dx 
     y = y + dy 
     println ("x 的座標點 : " + x); 
     println ("y 的座標點 : " + y); 
    } 
} 

class Location(override val xc: Int, 
       override val yc: Int, 
       val zc: Int) extends Point(xc, yc) { 
    var z: Int = zc 

    def move(dx: Int, dy: Int, dz: Int) { 
     x = x + dx 
     y = y + dy 
     z = z + dz 
     println ("x 的座標點 : " + x); 
     println ("y 的座標點 : " + y); 
     println ("z 的座標點 : " + z); 
    } 
} 

爲什麼方法move並不需要一個override修改?它不是類Point中的抽象方法,我認爲它應該用「覆蓋」來裝飾。實際上,當我添加「覆蓋」時,會發生錯誤。

而對於xc,yc,爲什麼「覆蓋」是一個nessesary?

我真的很困惑。

我有Python的經驗和很少的Java經驗。

任何幫助將不勝感激,謝謝!

+2

因爲'move'不'Point'抽象?它只是一種方法。當你調用'myLocation.move()'時,除非你在你的子類中覆蓋'',否則它會調用'Point.move()'。順便說一下,移動和位置的移動簽名完全不同,所以它不會被覆蓋。 – prayagupd

回答

0

for xc, yc, why "override" is a nessesary?

不,不是必要的。在你的情況下,你在你的子類中再次使用val,這是沒有必要的,因爲你已經在父類中將它們定義爲val(簡單地從子類中刪除VAL)

scala> class Point(val xc: Int, val yc: Int) {} 
defined class Point 

scala> class Location(xc: Int, yc: Int, val zc :Int) extends Point(xc, yc){} 
defined class Location 

Why the method "move" doesn't need an "override"?

因爲你在父類move方法是不是abstract方法 或您的簽名是在子類比父類不同。

例如。

abstract class Point(val xc: Int, val yc: Int) { 
    abstract def doWhatever() : Unit 
} 

class Location(xc: Int, yc: Int, val zc: Int) extends Point(xc, yc) { 
    override def doWhatever(): Unit = ??? // override is optional 
} 

你可以有醛overrid書房如果簽名是一樣的,所以,當你調用childClass.move(),調用重寫的方法。

class Point(val xc: Int, val yc: Int) { 
    def move() = println("parent::whatever") 
} 

class Location(xc: Int, yc: Int, val zc: Int) extends Point(xc, yc) { 
    override def move() = println("child::whatever") //override is required 
} 

例如調用移動方法,

爲父,

scala> val point = new Point(1, 2) 
point: Point = [email protected] 

scala> point.move() 
parent::whatever 

一個孩子,

scala> val location1 = new Location(1, 2, 3) 
location1: Location = [email protected] 

scala> location1.move() 
child::whatever 
+0

謝謝!我理解「移動」方法的解釋。但是,對於xc和yc,我刪除了「覆蓋」,並且解釋器告訴我「錯誤:在類Int中覆蓋值xc; 值xc需要'覆蓋'修飾符.....」。你可以進一步檢查我的代碼嗎?非常感謝!! – Phil

+0

你是否從子類中刪除'val',而不是父類? – prayagupd

+0

我懂了!非常感謝! – Phil