ケースクラスDataObject
を作りたいと思います。自己参照のパラメータは特定の特性でのみ使用できますか?
case class DataObject(parameter: Double)
私は必要に応じて機能を呼び出す機能を拡張したいと考えています。そのためには、機能を拡張するために、形質をDataObjectFunctionable
に拡張したいと考えています。この機能は、DataObject
にのみ割り当てる必要があります。
trait DataObjectFunctionable {
this: DataObject =>
def unimportantfunction(): Double = parameter + 1
protected val aFunction: AFunction
}
正確な実装は後で定義されるため、関数の要約はそのままにしておきます。余分な機能はDataObject
とDataObject
の機能であるため、機能はDataObjectFunctionable
となるため、機能の入力タイプとしてDataObjectFunctionable
とします。
trait AFunction {
def value(in: DataObjectFunctionable)
}
ここで、具体的なFunctionを定義します。これは、入力パラメータを超過したいときまで、すべて良好です。
object MyFunction extends AFunction {
def value(in: DataObjectFunctionable) = in.parameter + 2
}
ここでは、in.parameter
は解決できないと言われています。何故ですか? this: DataObject =>
DataObjectFunctionable
(unimportantfunction
と表示されているように)内にDataObject
のメンバーもいることを確認してください。この場合でも、私は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
"返品エラー"を定義できますか? – Reactormonk
@Reactormonk:done。編集された質問。 – Make42
何とかそれは整列していません - あなたは 'DataObject'に' value'をどこに添付しますか? – Reactormonk