我正在使用scala设计一个框架。该框架将具有3个特征:A,B和C.为了使用它,开发人员将扩展这些特征并提供实现。然后,他将调用一个将使用实现的execute()函数。
问题是:我不会将任何实例传递给execute函数。该函数应该使用在需要时提供的实现。我不知道该怎么做。
我的第一个想法是创建一个类(将包含该函数),它将接收参数3工厂方法来创建这些类的实例。代码将是这样的:
trait Abs{def f():Int}
case class Concr extends Abs{def f():Int = 8}
case class Manager[A <: Abs](val factory: () => A){def exec():Int = {factory().f()}}
Manager[Concr]({() => Concr()}).exec() //It evaluates 8
这个解决方案的问题是它很脏,因为在管理器中,每次你想要创建一个实例时我都要引用工厂,我试图找到一个更好的方法。
答案 0 :(得分:0)
它很脏,因为在经理中,每次要创建实例时都必须引用工厂
为什么这是一个问题?你必须写factory()
完全,如果你以某种方式神奇地引用它,你可以写Concr()
。这使得代码更清晰。
您可以使名称更清晰(例如A
或makeA
而不是factory
)和/或使用按名称参数(写factory: => A
并将其作为公正访问身体factory
。