Оставляя на минуту вопросы дизайна.
Если вам нужен обходной путь, вы можете привязать идентификатор к сопоставленному классу case или объекту case и использовать связанный идентификатор для доступа к членам совпадающей сущности. Связанный идентификатор можно использовать в защитных инструкциях в матче или в действии, предусмотренном для матча:
case class Bob(x: String, y: String) {val z = "Bragging"}
val bob1 = Bob("Big", "Bad")
bob1 match {
case b @ Bob(x, y) if b.z == "Bragging" => println("Got "+x+", "+y+", "+b.z+" Bob!")
case _ =>
}
case object Bob {val z = "Balding"}
val bob2 = Bob
bob2 match {
case b @ Bob if b.z == "Balding" => println("Got "+b.z+" Bob!")
case _ =>
}
Возвращаясь к дизайну, в своем определении класса case вы объявляете 'name' в теле конструктора B, но вы получите больше возможностей от использования 'name' в качестве параметра:
case class B(i: Int, name: String) extends A
Что может тогда соответствовать так:
def getType(s:String) = s match {
case B(_, name) => println ("Object B("+name+")")
...
Наконец, трудно сказать без дальнейших подробностей, но я подозреваю, что отображение классов прецедентов на большой набор похожих сущностей один на один, возможно, не лучший выбор, лучше использовать объекты прецедентов или экземпляры ограниченного числа тематических классов или даже кортежей.