[英]Are parameters of self reference only available in the specific trait?
我想構建一個案例類DataObject
。
case class DataObject(parameter: Double)
如果需要,我希望能夠使用調用函數的功能來擴展它。 為此,我希望能夠使用特征DataObjectFunctionable
對其進行擴展以使其可運行。 此功能應該只能分配給DataObject
因為它只在那里有意義。
trait DataObjectFunctionable {
this: DataObject =>
def unimportantfunction(): Double = parameter + 1
protected val aFunction: AFunction
}
確切的實現將在稍后定義,因此我保留 Function 抽象。 由於額外的功能只能是DataObject
的特征,而具有該功能的DataObject
將是DataObjectFunctionable
,我將DataObjectFunctionable
作為函數的輸入類型。
trait AFunction {
def value(in: DataObjectFunctionable)
}
現在我要定義我的具體函數。這一切都很好,直到我想超過輸入參數。
object MyFunction extends AFunction {
def value(in: DataObjectFunctionable) = in.parameter + 2
}
現在我被告知in.parameter
無法解析。 這是為什么? this: DataObject =>
確保DataObject
的成員在DataObjectFunctionable
中也可用(如unimportantfunction
)。 為什么雖然是這種情況,但我在MyFunction
沒有可供我使用的parameter
? 只是語言設計還是我做錯了什么?
我應該怎么做? 我找到
trait DataObjectFunctionable extends DataObject {
this: DataObject =>
def unimportantfunction(): Double = parameter + 1
protected val aFunction: AFunction
}
解決了這個問題,但這真的是要走的路嗎?
據我了解, trait DataObjectFunctionable extends DataObject
意味着“特征DataObjectFunctionable
只能由DataObject
或其子類擴展”。 但是,據我所知this: DataObject =>
意思相同......也許這里有一個誤解導致了我的問題。
順便說一下,這就是我所希望的:
val myObject1 = new DataObject(parameter = 5) extends DataObjectFunctionable {
override protected val aFunction: AFunction = MyFunction
}
val myObject2 = new DataObject(parameter = 5)
myObject1.value // returns 5
myObject2.value // that should not be possible, since myObject2 does not get the functionality. I want this to throw a compiler error
自引用類似於“私有繼承”。 如果您不希望繼承的參數對 trait 來說是“私有的”,為什么不讓它從DataObject
繼承而不是自引用呢?
或者,您可以使用def param = parameter
類的東西從特征中“導出”自引用def param = parameter
。
另外,請注意:不要擴展案例類,即使是特征也不行。 這幾乎總是一個壞主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.