我想构建一个案例类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
所示)。为什么虽然情况确实如此,但parameter
我没有MyFunction
可以使用trait DataObjectFunctionable extends DataObject {
this: DataObject =>
def unimportantfunction(): Double = parameter + 1
protected val aFunction: AFunction
}
?它只是语言设计还是我做错了什么?
我该怎么做?我找到了
trait DataObjectFunctionable extends DataObject
解决了这个问题,但这真的是要走的路吗?
据我了解,DataObjectFunctionable
表示"特征DataObject
只能通过this: DataObject =>
或其子类扩展{#1}}。但是,据我所知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
意思相同......也许这里存在误解导致我的问题。
顺便说一句,这是我所希望的:
Interface1:
Source:
Table: source_table
Cols:
column1: source_col1
column2: source_col2
column3: source_col3
column4: source_col4
column5: source_col5
column6: source_col6
etc..
Dest:
Table: dest_table
Cols:
column1: dest_col1
column2: dest_col2
column3: dest_col3
column4: dest_col4
column5: dest_col5
column6: dest_cols6
etc...
Interface2:
Source:
Table: source_table
Cols:
column1: source_col1
column2: source_col2
column3: source_col3
column4: source_col4
column5: source_col5
column6: source_col6
etc..
Dest:
Table: dest_table
Cols:
column1: dest_col1
column2: dest_col2
column3: dest_col3
column4: dest_col4
column5: dest_col5
column6: dest_col6
etc...
答案 0 :(得分:1)
自我引用类似于"私有继承"。
如果您不希望继承的参数是"私有"对于这个特性,为什么不让它继承自DataObject
而不是自我引用呢?
或者,您可以" export"来自特征的自引用参数,如def param = parameter
。
另外,请注意:不要扩展案例类,甚至不要使用特征。这几乎总是一个坏主意。