我已經使用了這幾種不同的方法...但還沒有找到明確的答案。在子類中重新定義一個變量類型(即變量隱藏)
class Foo1 { }
class Foo2 extends Foo1 { }
class Bar1 {
var foo: Foo1 = null
}
class Bar2 extends Bar1 {
var foo: Foo2 = null // <-- compiler error
}
錯誤說:「在類型test.Foo1類BAR1壓倒一切的變量foo的;變量foo的需要'越權」修飾」,但你也不能覆蓋變種。
在C#中,你可以使用new關鍵字這樣
class Foo1 { }
class Foo2 : Foo1 { }
class Bar1
{
public Foo1 foo = null;
}
class Bar2 : Bar1
{
public new Foo2 foo = null;
}
是否有可能做到這一點在Scala呢?
編輯 - 增加了另一個C#示例來說明爲什麼我這樣做。
class Foo1 { }
class Foo2 : Foo1 { }
class Bar1
{
public Foo1 Foo { get { return _foo; } }
protected Foo1 _foo;
public Bar1(Foo1 foo) { _foo = foo; }
}
class Bar2 : Bar1
{
public new Foo2 Foo { get { return _foo; } }
protected new Foo2 _foo;
public Bar2(Foo2 foo) : base(foo) { _foo = foo; }
}
當然,在真正的應用程序中,類的方式比較複雜,有許多成員,層次結構更深。
簡而言之,這對我來說就是它允許我在我的類層次結構中的任何位置使用foo變量,而不必使用醜陋的投射 - 如果我只在單獨的foo中聲明瞭這種情況Bar1類。
謝謝!
我不知道C#,可以在你的第二個代碼片段中賦值'foo'嗎? – Dimitri 2014-12-06 23:46:45
@Dimitri是的,如果你的意思是說x是Bar2的一個實例,那麼x.foo = new Foo2()是有效的代碼......但是這個例子有點過分,因爲這不是我在應用程序中使用它的原因我正在從C#移動到Scala。我會在這裏留下另一條消息或編輯我的問題來解釋更多爲什麼/我需要什麼。 – jross 2014-12-07 00:12:57