自引用参数仅在特定特征中可用吗?

时间:2016-10-12 15:30:39

标签: scala

我想构建一个案例类DataObject

case class DataObject(parameter: Double)

我希望能够在必要时使用调用函数的功能扩展它。为此,我希望能够使用特征DataObjectFunctionable扩展它以使其可用。此功能只应分配给DataObject,因为它只在那里有意义。

trait DataObjectFunctionable {
  this: DataObject =>
  def unimportantfunction(): Double = parameter + 1
  protected val aFunction: AFunction
}

确切的实现应在稍后定义,因此我保留了Function摘要。由于额外功能只是DataObjectDataObject的特征,其功能为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...

1 个答案:

答案 0 :(得分:1)

自我引用类似于"私有继承"。 如果您不希望继承的参数是"私有"对于这个特性,为什么不让它继承自DataObject而不是自我引用呢?

或者,您可以" export"来自特征的自引用参数,如def param = parameter

另外,请注意:不要扩展案例类,甚至不要使用特征。这几乎总是一个坏主意。