2016-12-01 20 views
1

的內部類:覆蓋鑑於<code>Foo</code>一類

class Foo { 
    def getBar = new Bar 

    class Bar { 
    def baz = 3 
    } 
} 

我希望能夠擴展Foo,並覆蓋baz
我能想到的最簡單的實現是這樣的:

class Foo2 extends Foo { 
    override def getBar = new Bar2 

    class Bar2 extends Bar { 
    override def baz = 5 
    } 
} 

,但我不知道是否有實現這個簡單的方法。 (getBar可能包含大量的代碼,我不不會複製它只是一個小的變化Bar粘貼 - >Bar2

我嘗試這樣做:

class Foo2 { 

    class Bar extends super.Bar { 
    override def baz = 5 
    } 
} 

但不幸的是它不起作用
new Foo2().getBar.baz == 3

任何其他想法?

更新:作爲響應

+0

爲什麼不使用'override'修飾符? –

+0

如果您在問題中提供的代碼編譯,它確實有幫助。 –

回答

2

重載類 固定的編譯錯誤,需要像virtual classes。但它們不存在,所以這是不可能的。

我建議不要做class Bar extends super.Bar,因爲那麼你只是將Bar類從Foo遮蔽下來,這隻會造成混淆。我認爲你可以做的最好的方法是在Foo中提供一個構造Bar的方法,作爲真實構造函數的別名。因爲方法可以被覆蓋,所以構造函數不能。

class Foo { 
    final def getBar = { 
    val i: Int = doLotsOfComputations1() 
    val s: String = doLotsOfComputations2() 
    initBar(i, s) 
    } 

    protected def initBar(i: Int, s: String): Bar = new Bar(i, s) 

    protected class Bar(i: Int, s: String) { 
    def baz = 3 
    } 
} 

class Foo2 extends Foo { 
    override protected def initBar(i: Int, s: String) = new Bar2(i, s) 

    protected class Bar2(i: Int, s: String) extends Bar(i, s) { 
    override def baz = 5 
    } 
} 
1

提到你缺少覆蓋

class Foo { 
def getBar = new Bar 

class Bar { 
    def baz = 3 
}} 

    class Foo2 extends Foo { 
override def getBar = new Bar2 

class Bar2 extends Bar { 
    override def baz = 5 
}}