我正面临一个设计问题,我的可怜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
类相关我的例子。)
AbstractJob
使用“抽象”函数直接调用runOnPlatform,以便在具体作业中实现。在这种情况下,我的用户只会编写他们需要的业务代码,但我确信我可以使用Scala概念做得更好。我觉得我只是在Scala中使用Java(通常是OOP)概念...... 我希望我足够清楚!