簡體   English   中英

自引用的參數是否僅在特定特征中可用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM