2012-04-17 15 views
6

एक उप-वर्ग द्वारा अतिरंजित होने पर मैं उसी विशिष्ट उपclass उदाहरण में लेने के लिए मूल विधियों को कैसे लागू कर सकता हूं?उपclassed तर्कों के साथ subclass विधियों को ओवरराइड करना?

यानी .:

abstract class Animal { 
    def mateWith(that: Animal) 
} 

class Cow extends Animal { 
    override def mateWith...? 
} 

तार्किक रूप से, एक Cow केवल mateWith एक और Cow में सक्षम होना चाहिए। हालांकि, अगर मैं override def mateWith(that: Cow) करता हूं, तो यह वास्तव में बेस क्लास विधि को ओवरराइड नहीं करता है (जिसे मैं चाहता हूं, क्योंकि मैं उप-वर्ग में अपने अस्तित्व को लागू करना चाहता हूं)।

मैं यह सुनिश्चित करने के लिए जांच सकता हूं कि दूसरा उदाहरण गाय प्रकार का है, और यदि यह नहीं है तो अपवाद फेंक दें - क्या यह मेरा सबसे अच्छा विकल्प है? अगर मेरे पास और जानवर हैं तो क्या होगा? मुझे अपवाद-फेंकने वाला कोड दोहराना होगा।

उत्तर

11
abstract class Animal[T <: Animal[T]] { 
    def mateWith(that: T) 
} 

class Cow extends Animal[Cow] { 
    override def mateWith(that: Cow) { println("cow") } 
} 

class Dog extends Animal[Dog] { 
    override def mateWith(that: Dog) { println("dog") } 
} 

और यह इस तरह का उपयोग करें:

scala> (new Cow).mateWith(new Cow) 
cow 

scala> (new Cow).mateWith(new Dog) 
<console>:17: error: type mismatch; 
found : Dog 
required: Cow 
       (new Cow).mateWith(new Dog) 
           ^

जरूरत कोई अपवाद-फेंकने कोड; टाइप सिस्टम संकलन समय पर आपके लिए इसे संभालता है!

+1

स्वीट डील, स्कैला हेक के रूप में सुविधाजनक! –

+1

मैं "सुविधाजनक" के बारे में इतना निश्चित नहीं हूं, लेकिन यह अभिव्यक्तिपूर्ण है। –

+1

सोचा कि मैं इसे फिर से देखूंगा - इसे [एफ-बाउंड-पॉलिमॉर्फिज्म] (https://twitter.github.io/scala_school/advanced-types.html#fbounded) के रूप में जाना जाता है। –

संबंधित मुद्दे