2010-07-02 12 views
7

निम्नलिखित दो के बीच क्या अंतर है?लक्षणों पर एक प्रश्न

1 #

trait B extends A { 

} 

2 #

trait B { self: A => 

} 

जहां A एक अमूर्त वर्ग है।

> > संपादित करें:

कृपया प्लगेबल उड़ान और quacking व्यवहार के साथ Duck के निम्न उदाहरण के संबंध में बताते हैं:

abstract class Duck { 
    def fly(): Unit 
    def quack(): Unit 
    def swim() { 
    println("Woodoowoodoowoodoo...") 
    } 
} 

trait FlyingWithWings extends Duck { 
    override def fly() { 
    println("Me can fliez! :D") 
    } 
} 

trait FlyingNoWay { self: Duck => 
    def fly() { 
    println("Me cannot fliez! :(") 
    } 
} 

trait Quack extends Duck { 
    override def quack() { 
    println("Quack! Quack!") 
    } 
} 

trait MuteQuack { self: Duck => 
    def quack() { 
    println("<<Silence>>") 
    } 
} 

class MallardDuck extends Duck with FlyingWithWings with MuteQuack 

object Main { 
    def main(args: Array[String]) { 
    val duck = new MallardDuck 
    duck.fly() 
    duck.quack() 
    } 
} 

आउटपुट:

मेरे fliez कर सकते हैं! : डी
< < साधना >>

+4

http://stackoverflow.com/questions/2224932/difference-between-trait-inheritance-and-self-type-annotation का डुप्लिकेट देखें, स्वयं http://stackoverflow.com/questions/1990948 का डुप्लिकेट/स्केल-सेल्फ-टाइप-एंड-ट्राइट-सबक्लास – VonC

उत्तर

5

दूसरे मामले में बी को उन स्थानों में उपयोग नहीं किया जा सकता है जहां ए की अपेक्षा की जाती है, इसे सिर्फ एक निश्चित ए को "संलग्न" करने के लिए डिज़ाइन किया गया है। उदाहरण के लिए पहले मामले में ए सार हो सकता है और बी लागू हो सकता है गायब तरीकों, इसे एक तत्काल प्रकार बनाते हैं। दूसरे मामले में यह संभव नहीं है, आपको "पूर्ण ए" की आवश्यकता है, और केवल तभी आप कुछ कार्यक्षमता जोड़ते हैं।

तो आप "एक ..." संबंध के बजाय "एक में फिट बैठता है" संबंध के बारे में सोच सकते हैं।

+0

कौन सा प्राथमिकता दी जानी चाहिए? और क्यों? –

+0

यह निर्भर करता है कि आप वास्तव में आधार विशेषता का विस्तार करते हैं या नहीं। जैसे यदि आपके पास एक विशेषता ग्राफ है, तो एक नया विशेषता रंगीन ग्राफ स्पष्ट रूप से "एक" (नया प्रकार) ग्राफ है और आधार विशेषता का विस्तार करना चाहिए। दूसरी तरफ यदि आप किसी विधि को ढूंढने के साथ एक विशेषता जोड़ते हैं, तो यह विशेषता केवल ग्राफ़ के साथ उपयोग की जाने वाली समझ में होती है, लेकिन यह एक नया प्रकार का ग्राफ नहीं बनाता है, यह केवल कुछ कार्यक्षमता जोड़ता है, इसलिए आप दूसरा संस्करण चुनेंगे इस मामले में स्वयं के प्रकार के साथ। कुछ मामलों के लिए मतभेद इतना स्पष्ट नहीं हैं, लेकिन कुछ अनुभवों के साथ आप देखेंगे कि कौन सा संस्करण आपके डिजाइन में बेहतर है। – Landei

+0

मुझे नहीं लगता कि आपको मुझे मिला है। मुझे दोबारा बदलने की कोशिश करें। मेरे प्रश्न में, 'ए' एक 'सार वर्ग' है, न कि 'विशेषता'। उदाहरण में मैंने शामिल किया है, दोनों तरीकों से व्यवहार को प्लग (या मिश्रण) करना संभव है। ('फ्लाइंगविथविंग्स 'एक्सटेंशन का उपयोग करता है जबकि' म्यूटक्वैक 'स्वयं प्रकार की एनोटेशन का उपयोग करता है।) तो मुझे दूसरे पर एक तरफ कब पसंद करना चाहिए और क्यों? –

1

पहला उदाहरण B में A की विशेषज्ञता है। दूसरा मतलब है कि B विशेषता हमेशा किसी चीज में मिश्रित होनी चाहिए, या A (जो कक्षा, विशेषता या कोई अन्य प्रकार हो सकती है) का उप-प्रकार होना चाहिए।

+2

कोई विशेषता कोई वर्ग भी बढ़ा सकती है – Aymen

+0

मुझे यह नहीं पता था, लेकिन मैंने इसे आरपीएल में देखा और यह काम करता है । आपके पास अभी भी प्रत्यक्ष वंश में एक से अधिक कक्षाएं नहीं हो सकती हैं, हालांकि, आपको एकाधिक विरासत नहीं मिल सकती है (यही कारण है कि मैं कक्षाओं में विस्तार करने के गुण नहीं रख सकता था)। – Theo

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