2011-10-19 13 views
8

मिलान निम्नलिखित कोड का दावा है कि जैक निर्माण में कार्यरत है, लेकिन जेन अभी तक किसी न किसी अर्थव्यवस्था का एक और शिकार है:स्काला: मामले कक्षाएं

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" 
    } 
} 

क्यों मैच एक छात्र के रूप में जेन पहचान करने में विफल रहा है?

उत्तर

4

एमिल पूरी तरह से सही है, लेकिन यहां एक उदाहरण यह स्पष्ट करना है:

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 

अधिक सटीक होना, इस लाइन:

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

वास्तव में इसका मतलब है

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

दुर्भाग्य से , जबकि जेन को जेक पर तत्काल बनाया गया था, जेन के मामले में this जेन को इंगित कर रहा है ।

5

मुझे विश्वास है कि यहां क्या हो रहा है यह है कि Student केस क्लास Person के अंदर घोषित किया जा रहा है। इसलिए case StudenttoString में केवल Student एस से मेल खाएगा जो एक विशेष Person उदाहरण का हिस्सा हैं।

आप case class Student ले जाते हैं case class Worker के समांतर (और फिर object Narrator से अनावश्यक extends Person("Jake") को दूर ... जो केवल वहाँ है ताकि new Student जा रहा है जेक करने के लिए एक Person$Student विशिष्ट समापन), आप जेन करता मिलेगा वास्तव में जीवविज्ञान का अध्ययन करें।

+0

क्या आप "एक विशेष व्यक्ति उदाहरण" से क्या मतलब समझ सकते हैं? – divider

+0

किसी को भी पता है कि यह व्यवहार कहीं भी दस्तावेज है? –

+0

@ डिवाइडर: 'दोस्त' एक 'कथनकर्ता' है, लेकिन 'दोस्त' पर्सन नहीं है। –