具有抽象类的自我类型特征

时间:2014-04-07 16:02:05

标签: scala

我正面临一个设计问题,我的可怜Scala级别无法处理。

我有一个抽象类,让我们说:

abstract class AbstractJob {
    def run: Long
    implicit val someVal: String
}

然后,我有“平台”可以运行作业。

我想声明包含真实“作业”的子类(不需要知道它应该实际做什么)。理想情况下,我希望它们以这种方式声明:

class OneJob with Platform1 with Platform2 {
    override def run = { 
        ... some code returning a long result ... 
    }

    override implicit val someVal = "foo"
}

事实上,工作可以有多个可以运行的平台。

但是,作业的run方法必须由平台启动。因此我尝试使用自我类型:

trait Platform1 { self: AbstractJob =>
    def runOnPlatform = someFunctionRelatedToPlatform(run(someVal))
}

不幸的是,在调用someVal值时(在任何扩展AbstractJob的作业中),我得到一个空值。我得出结论,自我类型的特征与定义的类直接相关(而不是实际的类,在我的情况下是一个子类型)

我尝试为特征中的自我类型定义另一种类型type Jobs :> AbstractJob,但这不起作用。

我的备份解决方案数量有限,但我希望使用Scala的“全部功能”并避免开发人员编写大量冗余和“管道工”代码(与平台和AbstractJob类相关我的例子。)

  1. AbstractJob使用“抽象”函数直接调用runOnPlatform,以便在具体作业中实现。在这种情况下,我的用户只会编写他们需要的业务代码,但我确信我可以使用Scala概念做得更好。我觉得我只是在Scala中使用Java(通常是OOP)概念......
  2. 让用户写下大量的冗余代码......显然我尽可能地避免这种情况!!
  3. 我希望我足够清楚!

0 个答案:

没有答案