让我们假设我们有一个 trait T
。实现以下目标的最佳方法是什么:
- 每个编写 的实现的人都
T
应该被迫提供一种允许 的无参数初始化的可能性T
,即,我们可能必须强制执行可配置工厂的实现。 - 所有仅依赖于(的某个实现
A
的T
)实际初始化参数的逻辑/数据都应该集中处理/存储,但应该在工厂和A
.
我看到实现这一点的最简单/简洁的方法(大约)是为工厂添加一个特征并链接T
到该工厂:
trait T {
val factory: TFactory
}
trait TFactory {
def build(): T
val description: String // example for logic/data that only depend on the parameters
}
// example implementation:
class A(val factory: AFactory, paramA: Int, paramB: Int, paramC: Int) extends T
class AFactory(paramA: Int, paramB: Int, paramC: Int) extends TFactory {
def build = new A(this, paramA, paramB, paramC)
val description = f"$paramA $paramB $paramC"
}
显然,这并没有真正“强制”工厂的实现(只要有可用的替代实现),并且显然可以生成A
指向“错误”的链接的实例化TFactory
。我也不喜欢这种方法的是初始化参数的重复。我经常创建另一个类AParams
,它再次包装所有参数(例如为了方便添加新参数)。因此,我最终得到了三个类,恕我直言,这是这个简单问题的很多样板。
我的问题是是否有(可能完全)不同的方法,它实现了相同的主要目标但更简洁?