我有一個抽象基類(Base
),其具有用於將其(StackingTrait
)定義了一些堆疊性狀。斯卡拉:性狀密新與抽象基類
trait Base {
def foo
}
trait StackingTrait extends Base {
abstract override def foo { super.foo }
}
這將是實現使用下面的語法子很方便,但是,這並不工作,因爲編譯器說,FOO需要與override
,然後被宣佈與abstract override
上重新編譯,這是無效的,因爲Impl
是一類。
class Impl extends Base with StackingTrait {
def foo {}
}
我想不出爲什麼這樣的語法將被禁止的好理由; foo在邏輯上用Impl
定義,以便在概念上進行堆疊的順序保持不變。
注意: 我想出了這種解決方法,它將有效地做我想做的同樣的事情,但輔助類的必要性使我想要更好的解決方案。
class ImplHelper extends Base {
def foo {}
}
class Impl extends ImplHelper with StackingTrait
爲什麼所需的語法不能編譯,是有一個優雅的解決方案嗎?
很好的答案!我正要發佈關於這種情況的問題。謝謝! –
我剛剛也遇到了這個問題。線性化對此最終是正確的,但我意識到堆疊特徵的真實世界目的是這樣的:您可以僅使用堆棧特徵對現有的通用抽象類/特徵的具體實現進行修改。 IE瀏覽器。有一個「抽象類List」和一個「特性Mod擴展列表」。你不能只寫'Foo類擴展List with Mod'。首先,你必須有一個具體的List,比如'class LinkedList extends List',然後你可以編寫'class Bar extends Mod'來擴展LinkedList。希望這是有道理的。 –
我忘了補充一點,這只是關注'abstract override'方法的特性,要清楚。沒有這些方法,似乎特質可以自由混合。 –