2011-11-06 35 views
8

方法調用某些超一流的。如果我有斯卡拉類星座是這樣的:選擇Scala中

class A { 
def foo() = "bar" 
} 

class B extends A { 
override def foo() = "BAR" 
} 

class C extends B { 
} 

是否有可能在C類顯式調用在一個被定義的方法foo?

回答

8

不,你不能,因爲它違反了封裝。你繞過你父母的行爲,所以C應該擴展B,但你繞過了這個。

請參閱Jon Skeets對同一問題Why is super.super.method(); not allowed in Java?的優秀回答。

請注意,您可以通過反射訪問該字段,但您不想這樣做。

3

不,我會離開它,但顯然是SO要我繼續30個角色。

+11

如果你碰巧知道爲什麼這是不可能的原因,可能是一些以填補30個字符:) – arsenbonbon

17

沒有,但你可以用多個性狀的遺傳相似的東西:

trait A { def foo = "from A" } 

class B extends A { override def foo = "from B" } 

class C extends B with A { 
    val b = foo   // "from B" 
    val a = super[A].foo // "from A" 
} 
+0

而爲什麼這不會像@Matthew在他的回答中所說的那樣違反封裝? – MaxNevermind

+1

在這個例子中,類「C」顯式擴展了'A',所以它直接訪問'A'的行爲。說實話,這個例子看起來很奇怪,我不確定這是不錯的風格。 –