abstract class A

case class AA(s: String) extends A

abstract class AB(n: Int) extends A

case class ABA(n: Int) extends AB(n)
case class ABB(n: Int) extends AB(n)

object Main extends App {
    val list: List[A] = List(AA("aa"), ABA(12), ABB(34))
    for(a <- list) {
        a match {
            case AA(s) => println("AA:" + s)
            case AB(n) => println("AB:" + n)
        }
    }
}

このようなパターンマッチを書くには、どのようなunapplyを定義すれば良いのでしょうか。