2016-12-01 66 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 
}}