假設我有一個ADT是這樣的:在這種情況下你會使用類型類嗎?
sealed trait A extends Product with Serializable
object A {
case class A1() extends A
case class A2() extends A
case class A3() extends A
case class A4() extends A
}
還假設我有一個trait AFoo
這樣的:
type Foo = ...
trait AFoo { def asFoo(a: A): Foo }
現在我需要爲AFoo
提供兩種不同的實現。所以我寫這樣的東西:
abstract class AFooSupport extends AFoo {
protected def asFoo1(a1: A1): Foo
protected def asFoo2(a2: A2): Foo
protected def asFoo3(a3: A3): Foo
protected def asFoo4(a4: A4): Foo
def asFoo(a: A) = a match {
case a1: A1 => asFoo1(a1)
case a2: A2 => asFoo2(a2)
case a3: A3 => asFoo3(a3)
case a4: A4 => asFoo4(a4)
}
}
class AFoo1 extends AFooSupport {
// implement asFoo1, asFoo2, asFoo3, asFoo4
}
class AFoo2 extends AFooSupport {
// implement asFoo1, asFoo2, asFoo3, asFoo4
}
這種方法可能會工作,但我想知道是否有更好的方法來做到這一點。在這種情況下,你會使用類型的嗎?
你確實需要'asFoo'的多個實現嗎?對僅適用於單個ADT的操作使用類型類似乎很奇怪。如果你真的想抽象出匹配,那麼摺疊看起來更合理。 –
我只需要一個'asFoo'的實現。將嘗試'摺疊',謝謝。 – Michael