我是新來的Scala,來自Java,我只是讀了關於特性。有一件事經常被提到,特質不(不會?不會?)具有構造參數。我很想知道是否有這個原因。爲什麼Scala特質不允許構造函數參數?
來自很久以前的數學/計算機科學背景我一直在想,如果這是由於某種語言設計決定造成的不可避免的後果,或者如果這是一個有意識的決定,以避免一些繼承/混合問題或另一個?
希望有人知道,因爲它感覺有可能是事實背後有一些有趣的事情。
我是新來的Scala,來自Java,我只是讀了關於特性。有一件事經常被提到,特質不(不會?不會?)具有構造參數。我很想知道是否有這個原因。爲什麼Scala特質不允許構造函數參數?
來自很久以前的數學/計算機科學背景我一直在想,如果這是由於某種語言設計決定造成的不可避免的後果,或者如果這是一個有意識的決定,以避免一些繼承/混合問題或另一個?
希望有人知道,因爲它感覺有可能是事實背後有一些有趣的事情。
其他的答案描述語言;我懷疑你的問題可能真的是「爲什麼這樣設計」。
我相信它產生於awkwardnesses和冗長外即延長當多個性狀,尤其是與覆蓋,並與類型,以及各種混合式策略會出現。
蛋糕模式通常會導致各種性狀以混合類中完全不可見的方式提供缺失位。並且混合可以是雙向的,使用self-types。因此,從特質中構建一個類對於編譯器來說可能是非常混亂的事情。爲了簡化語言使用和代碼簡化,Scala經常交換編譯器設計和實現的簡單性,這當然是一個很好的例子。
因此,儘管在具有構造可能是有用的和足夠的有可能是簡單的,分層的情況下,它幾乎肯定是多餘的更多的困難,不分層場景的其他機制。
特徵沒有構造函數參數,因爲特徵不能構造。鑑於任何特徵T
這是不可能實例化任何類型的對象完全是T
。您可以覆蓋特質DEFS有丘壑了,所以
trait Foo {
def bar: String
}
class Baz(override val bar: String) extends Foo
你不能直接構造它們,因爲new MyTrait {}
實際上是糖匿名類的new Object with MyTrait {}
嗯。同樣的邏輯適用於抽象類,不是嗎?我會說特質*應該被允許有構造函數,而且我也不明白他們爲什麼不被允許。 – Madoc 2015-04-01 14:58:00
答案是:這就是Scala現在的情況。
但可能不會在將來的情況:特徵參數可以取代早期的初始化。 (請參見Martin Odersky最近的Scala Days演示文稿第34頁) Scala: Where It Came From & Where It is Going
特徵是Java接口的模擬特徵。主要區別在於特質可以爲其方法實施默認實現。
所以Java接口不能有構造函數,以便做斯卡拉性狀
考慮您可以通過覆蓋瓦爾斯和懶洋洋地做着構造身體的其餘部分幾乎模擬構造函數的參數,我懷疑有一個背後的深層次原因。當然,也許有。也許與Java/Scala互操作有關? – Cubic 2015-04-01 14:00:31
特徵沒有構造函數。這幾乎是類和特質的定義區別 – Martijn 2015-04-01 14:01:55
相關:http://stackoverflow.com/questions/2804041/constructor-in-an-interface – 2015-04-01 15:09:06