根据实例 class 类型限制特征方法
Type restricting trait methods depending on instance class
是否可以根据扩展 class 将特征中定义的方法限制为特定类型?例如:
trait Score extends Ordered[Score] {
val reducedValue: Float // must be implemented by extending classes
def compare (that: Score): Int = this.reducedValue.compare(that.reducedValue)
}
case class MarksScore (set: Boolean) extends Score {
val reducedValue = if (this.set) 1.0f else 0.0f
}
case class RankingScore (rank: Float) extends Score {
val reducedValue = this.rank
}
这样,MarksScore(true)
就相当于 RankingScore(5)
,这很好,但毫无意义。所以我想将 compare
限制为各自 class 的对象,而不是 Score
.
的所有实现者
有些地方感觉不太对,但它实现了我的要求:
trait Score[T <: Score[T]] extends Ordered[T] {
val reducedValue: Float
def compare (that: T): Int = this.reducedValue.compare(that.reducedValue)
}
case class MarksScore (set: Boolean) extends Score[MarksScore] {
val reducedValue = if (this.set) 1.0f else 0.0f
}
case class RankingScore (rank: Float) extends Score[RankingScore] {
val reducedValue = this.rank
}
是否可以根据扩展 class 将特征中定义的方法限制为特定类型?例如:
trait Score extends Ordered[Score] {
val reducedValue: Float // must be implemented by extending classes
def compare (that: Score): Int = this.reducedValue.compare(that.reducedValue)
}
case class MarksScore (set: Boolean) extends Score {
val reducedValue = if (this.set) 1.0f else 0.0f
}
case class RankingScore (rank: Float) extends Score {
val reducedValue = this.rank
}
这样,MarksScore(true)
就相当于 RankingScore(5)
,这很好,但毫无意义。所以我想将 compare
限制为各自 class 的对象,而不是 Score
.
有些地方感觉不太对,但它实现了我的要求:
trait Score[T <: Score[T]] extends Ordered[T] {
val reducedValue: Float
def compare (that: T): Int = this.reducedValue.compare(that.reducedValue)
}
case class MarksScore (set: Boolean) extends Score[MarksScore] {
val reducedValue = if (this.set) 1.0f else 0.0f
}
case class RankingScore (rank: Float) extends Score[RankingScore] {
val reducedValue = this.rank
}