【发布时间】:2014-02-16 11:15:36
【问题描述】:
我想要一个类型的方法来返回它混合的类型。例如,本着以下精神的东西:
trait A {
def withoutA: this.type without A
}
所以在A with B with C 类型的情况下,withoutA 方法将有一个签名B with C,在A with D 的情况下 - 只是D。
这是否可以实现?如果可以,如何实现?
这是一个如何使用它的示例:
trait Limit {
def limit(a: Int): this.type without Limit
}
trait Offset {
def offset(a: Int): this.type without Offset
}
val sqlBuilder = new Limit with Offset { ... }
sqlBuilder.limit(2).offset(4) // valid code
sqlBuilder.offset(4).limit(2) // valid code
sqlBuilder.limit(2).limit(4) // invalid code
【问题讨论】:
-
你需要这个功能做什么? (只是想知道您认为这对什么有用)。
-
@Jesper 不容易描述。一个复合构建器,因此随着每个方法的应用而丢失方法。这提供了静态保证,即只有有意义的方法可用。
-
这可以通过类型安全的构建器模式来完成。正如您可能发现的那样,对强制参数进行至少一次调用并不难,但很难只获得一次。我推荐 Jim McBeath 关于解决这个问题的三部分系列博客:jim-mcbeath.blogspot.com/2009/09/…