2010-12-04 12 views
37

मैं निम्नलिखित करना चाहता हूं, लेकिन स्वयं-प्रकार की रेखा संकलित नहीं होती है। क्या मेरे पास यह वाक्यविन्यास गलत है या क्या यह असंभव है?कई आत्म-प्रकार संभव हैं?

trait A { 
    def aValue = 1 
} 
trait B { 
    def bValue = 1 
} 
trait C { 
    a : A, b : B => 
    def total = a.aValue + b.bValue 
} 

class T extends C with A with B { ... 

उत्तर

65

आपके पास एक एकल प्रकार हो सकता है जो एक यौगिक प्रकार है।

इस प्रयास करें:

trait A { 
    def aValue = 1 
} 
trait B { 
    def bValue = 1 
} 
trait C { 
    self: A with B => 
    def total = aValue + bValue 
} 

class ABC extends A with B with C 
2

विशेषता के साथ एक आप संरचनात्मक प्रकार साथ यह कर सकते हैं:

trait C { 
    self: { def aValue: Int 
      def bValue: Int } => 

    def total = aValue + bValue 
} 

class ABC extends C { 
    def aValue = 1 
    def bValue = 1 
} 

इस्तेमाल किया प्रतिबिंब।

लेकिन, सबसे पहले आपको principle of least power की वजह से स्वयं प्रकारों का अधिक उपयोग नहीं करना चाहिए। सवाल से

तरीके का विस्तार अन्य टैट द्वारा बस जोड़ा जा सकता है:

trait C extends A with B{ 
    def total = aValue + bValue 
} 

या स्पष्ट रूप से दोनों तरीकों टाइप करें:

trait C { 
    def aValue: Int 
    def bValue: Int 

    def total = aValue + bValue 
} 

कहाँ आत्म प्रकार उपयोग कैसे करें?

स्व-प्रकार आमतौर पर कक्षाओं के साथ उपयोग किया जाता है। वांछित वर्ग के उप-वर्ग होने की आवश्यकता के लिए यह एक अच्छा तरीका है।

ट्रिप के साथ स्वयं-प्रकार का एक अच्छा उपयोग भी है: जब आप बहु-विरासत के साथ कक्षा प्रारंभिकरण के क्रम में हेरफेर करना चाहते हैं।

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