2011-10-19 25 views
8

Aşağıdaki kod, Jack'in inşaatta çalıştığını iddia ediyor, ancak Jane, zorlu ekonominin bir başka kurbanıdır:Scala: Eşleşen vaka sınıfları

abstract class Person(name: String) { 

    case class Student(name: String, major: String) extends Person(name) 

    override def toString(): String = this match { 
    case Student(name, major) => name + " studies " + major 
    case Worker(name, occupation) => name + " does " + occupation 
    case _ => name + " is unemployed" 
    } 
} 

case class Worker(name: String, job: String) extends Person(name) 

object Narrator extends Person("Jake") { 
    def main(args: Array[String]) { 
    var friend: Person = new Student("Jane", "biology") 
    println("My friend " + friend) //outputs "Jane is unemployed" 
    friend = new Worker("Jack", "construction") 
    println("My friend " + friend) //outputs "Jack does construction" 
    } 
} 

Neden Jane'i Öğrenci olarak tanımak başarısız?

cevap

4

Emil tamamen doğru, ama burada bir örnek açıklığa kavuşturmak için var:

scala> case class A(a: String) { 
    | case class B(b: String) 
    | def who(obj: Any) = obj match { 
    |  case B(b) => println("I'm A("+a+").B("+b+").") 
    |  case b: A#B => println("I'm B("+b+") from some A") 
    |  case other => println("Who am I?") 
    | } 
    | } 
defined class A 

scala> val a1 = A("a1") 
a1: A = A(a1) 

scala> val a2 = A("a2") 
a2: A = A(a2) 

scala> val b1= a1.B("b1") 
b1: a1.B = B(b1) 

scala> val b2 = a2.B("b2") 
b2: a2.B = B(b2) 

scala> a1 who b1 
I'm A(a1).B(b1). 

scala> a1 who b2 
I'm B(B(b2)) from some A 

daha kesin olmak gerekirse, bu satırı:

case Student(name, major) => name + " studies " + major 

gerçekten yazık ki

case this.Student(name, major) => name + " studies " + major 

demektir Jane, Jake'in üzerine getirilirken, Jane'in durumunda this, Jane'in kendisine işaret ediyor .

5

Burada olup bitenler, kasa sınıfının Person içinde bildirildiğidir. Dolayısıyla, toString'daki case Student, yalnızca belirli bir Person örneğinin parçası olan Student s ile eşleşecektir.

Eğer case class Worker paralel olması (ve sonra new Student Jake'e bir Person$Student spesifik olmak yara böylece sadece var olduğu ... object Narrator gereksiz extends Person("Jake") kaldırmak), Jane yapar bulacaksınız için case class Student taşırsanız Gerçekten de biyoloji çalışması.

+0

"Belirli bir Kişi örneği" ne demek istediğini açıklayabilir misiniz? – divider

+0

Bu davranış herhangi bir yerde belgelenmiş olup olmadığını bilen var mı? –

+0

@divider: 'friend' bir 'Narrator.Person' değil, bir' friend.Person' değil. –

İlgili konular