2014-04-05 41 views
0

我寫如下代碼:怎樣才能訪問對象的超類的成員

class TestClass(val mem:Int) 
    object TestObj extends TestClass(3){ 
     var sum = 5 
     def apply(a : Int, b :Int, ext : TestClass) = sum + a + b + super.mem + ext.mem 
    } 
    println(TestObj(2,4,new TestClass(2)) 

當我刪除super.mem從方法適用,這些代碼可以成功地編譯,所以我想知道如何能我在對象中訪問超級成員?

+1

爲什麼不'this.mem'或者只是'mem'? –

回答

1

您不需要在mem前添加super.;只需使用mem,TestObj繼承它的超類TestClass

class TestClass(val mem: Int) 

object TestObj extends TestClass(3) { 
    var sum = 5 
    def apply(a: Int, b: Int, ext: TestClass) = sum + a + b + mem + ext.mem 
} 

println(TestObj(2, 4, new TestClass(2)) 
+0

謝謝,它的工作原理。但是我仍然有一個疑問:由於對象的方法就像一個靜態方法,爲什麼正常的成員從繼承的非靜態類可以直接被他訪問。在java或C++中,靜態方法只能訪問類級別的成員而不是實例級別的成員。 – tecdigger

+1

「因爲對象的方法就像一個靜態方法」 - 這個想法在這裏誤導了你。 TestObj是某個類的實例,並且該類擴展了TestClass。繼承照常運作。 Singleton方法通常與Java中的靜態方法有相同的目的(但更乾淨),實際上可以從* Java調用靜態方法*,但在Scala中,所有對象都是真正的對象。 – AmigoNico