2009-05-12 12 views
8

मैं स्कैला के बारे में एक पुस्तक पढ़ रहा हूं और स्टैकेबल संशोधनों का उल्लेखगुण का उपयोग कर रहा है। स्टैकेबल संशोधनों और किस उद्देश्य के लिए उनका उपयोग किया जाना है?स्टैकेबल संशोधनों क्या हैं?

+0

पुस्तक इसे विशेषता अध्याय में बताती है। – Rayne

उत्तर

8

मौलिक गुणवत्ता जो स्टेकेबल संशोधनों को अलग करती है (जैसा कि शब्दावली स्केल में भी प्रयोग की जाती है) यह है कि "सुपर" गतिशील रूप से प्रभावित होता है कि विशेषता कैसे मिश्रित होती है, जबकि सामान्य सुपर में एक स्थिर रूप से निर्धारित लक्ष्य होता है।

यदि आप फू "सुपर" के लिए लिखने

abstract class Bar { def bar(x: Int): Int } 
class Foo extends Bar { def bar(x: Int) = x } 

तो हमेशा बार किया जाएगा।

कि विधि सुपर के लिए अनजान बनी हुई है जब तक कक्षा किया जाता है, तो आप

trait Foo1 extends Foo { abstract override def bar(x: Int) = x + super.bar(x) } 

तो लिखें।

trait Foo2 extends Foo { abstract override def bar(x: Int) = x * super.bar(x) } 

scala> (new Foo with Foo2 with Foo1).bar(5) 
res0: Int = 30 

scala> (new Foo with Foo1 with Foo2).bar(5) 
res1: Int = 50 

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

+0

सिर्फ "विशेषता Foo1 फू फैलाता है" की बजाय "विशेषता Foo1 बार बार फैली हुई है" के लिए लालित्य के लिए? –

+0

बोरिस - आप बिल्कुल सही हैं, यह केवल वही लिखा गया है क्योंकि मैंने आखिरी मिनट में बार जोड़ा था। – extempore

1

मैंने Real-World Scala presentation पर देखा जहां शब्द स्टेकेबल संशोधनों का भी उपयोग किया जाता है। स्पष्ट रूप से यह गुण हैं जो ओवरराइड करते समय सुपर विधि को कॉल करते हैं, अनिवार्य रूप से कार्यक्षमता जोड़ते हैं और इसे प्रतिस्थापित नहीं करते हैं। तो आप गुणों के साथ कार्यक्षमता जमा करते हैं, और इसका उपयोग किया जा सकता है जहां जावा में हम अक्सर पहलुओं का उपयोग करते हैं। विशेषता "रोचक" विधियों को ओवरराइड करने और लॉगिंग इत्यादि जैसी विशिष्ट कार्यक्षमता को जोड़ने और फिर श्रृंखला में अगली विशेषता में सुपर और "गेंद को पार करने" को जोड़कर एक पहलू की भूमिका निभाती है। HTH।

+0

स्लाइड्स का एक अद्भुत सेट क्या मिला! – egaga

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