2011-03-29 6 views
13

क्या यह संभव है स्काला की तरह कुछ लिखने में करने के लिए:मैं स्कैला में किसी सदस्य को कैसे प्रतिनिधि दे सकता हूं?

trait Road { 
    ... 
} 

class BridgeCauseway extends Road { 
    // implements method in Road 
} 

class Bridge extends Road { 
    val roadway = new BridgeCauseway() 

    // delegate all Bridge methods to the `roadway` member 
} 

या मैं एक के बाद एक Road के तरीकों में से प्रत्येक को लागू करने की जरूरत है, और roadway पर इसी विधि कहते हैं? जब तक आप की जरूरत नहीं है के रूप में मूल Bridge (जैसे आप 'की सवारी के लिए साथ ले जाने के लिए

class Bridge { ... } 
implicit def bridge2road(b: Bridge) = b.roadway 

:

+6

केविन राइट की ऑटो-प्रॉक्सी कंपाइलर प्लगइन देखें। –

+4

@ डैनियल - दिलचस्प है कि आपको यह कहना चाहिए कि, मैंने हाल ही में एक बार बैक अप निकाल दिया है। 2.9 कंपाइलर में बदलाव हैं जो मेरे मूल डिजाइन का समर्थन करने में सक्षम हैं। –

+0

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

उत्तर

14

सबसे आसान तरीका है यह पूरा करने के एक वर्ग एक्सटेंशन के बजाय एक अंतर्निहित रूपांतरण के साथ है Road के संग्रह में Bridge स्टोर करने जा रहे हैं)।

आप फिर से वापस Bridge प्राप्त करने की आवश्यकता है, तो आप Road जो एक Any रिटर्न में एक owner विधि जोड़ते समय BridgeCauseway के लिए एक निर्माता पैरामीटर का उपयोग कर सेट कर सकते हैं, और फिर पैटर्न मैचों की अपनी पुल पाने के लिए:

trait Road { 
    def owner: Any 
    ... 
} 

class BridgeCauseway(val owner: Bridge) extends Road { . . . } 

class Bridge extends Road { 
    val roadway = new BridgeCauseway(this) 
    ... 
} 

myBridgeCauseway.owner match { 
    case b: Bridge => // Do bridge-specific stuff 
    ... 
} 
+0

आप 'ब्रिज' ऑब्जेक्ट साथी के अंदर निहित क्यों नहीं डालते? यह एक ऑटो-फॉरवर्ड सुनिश्चित करेगा। बेशक, यदि विधियां दुष्प्रभावपूर्ण हैं, तो यह वांछित के रूप में काम नहीं कर सकती है। –

+0

@ डैनियल - मैंने ऐसा इसलिए नहीं किया क्योंकि कोई साथी नहीं था। लेकिन मैं सहमत हूं, 'ऑब्जेक्ट ब्रिज {...}' के अंदर अंतर्निहित डालने वाला सामान्य रूप से क्या चाहता है। –

+0

मुझे पता है कि एक निहित बच्चे को बच्चे के साथ प्रतिस्थापित कर सकता है, लेकिन क्या बच्चे के साथ बच्चे को प्रतिस्थापित करने के लिए निहितार्थ का उपयोग करने का कोई तरीका है। माता-पिता? –

3

यदि आप Bridgetrait बना सकते हैं तो आपको सॉर्ट किया जाएगा।

scala> trait A { 
    | val x: String 
    | } 
defined trait A 

scala> class B extends A { 
    | val x = "foo" 
    | val y = "bar" 
    | } 
defined class B 

scala> trait C extends A { self: B =>   
    | val z = "baz"    
    | } 
defined trait C 

scala> new B with C 
res51: B with C = [email protected] 

scala> res51.x 
res52: java.lang.String = foo 

scala> res51.y 
res53: java.lang.String = bar 

scala> res51.z 
res54: java.lang.String = baz 
संबंधित मुद्दे

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