2011-11-09 7 views
12

मैं स्कैला से शुरू कर रहा हूं और मुझे यह थोड़ा अजीब मिला। जावा में मैं कुछ इस तरह कर सकता है:कक्षाएं जो अन्य वर्गों को विस्तारित नहीं करती हैं, उन्हें लक्षणों से क्यों बढ़ाया जाना चाहिए? (काम नहीं करता है)

interface Foo{} 

public class Bar implements Foo{} 

मैं स्काला के साथ इसी तरह कुछ करने के लिए कोशिश कर रहा हूँ, लेकिन यह काम नहीं करता है: मैं का उपयोग करने के

trait Foo; 
class Bar with Foo; // This doesn't work! 

"फैली" कीवर्ड :

class Bar extends Foo; // This works OK! 

अब, यह ठीक है, लेकिन यह वही नहीं है जो मैं चाहता था।

एक और बात अजीब मैं ने कहा कि स्काला में हर वर्ग को देखते हुए (scala-lang.org से इस छवि को देखें: http://www.scala-lang.org/sites/default/files/images/classhierarchy.png) AnyRef तक फैली हुई है मैं यह कर सकते हैं:

class Bar extends AnyRef with Foo; // This works too! 

तो, मैं क्या याद आ रही है ? इसे विस्तारित किए बिना एक विशेषता का उपयोग करने के लिए समझ में नहीं आता है?

धन्यवाद!

उत्तर

21

सबसे पहले टिप्पणी को लागू करने वाली अंतर संकलक की तुलना में यह पता नहीं होता की कोई बात नहीं बताता फैली /। मेरा मतलब यह नहीं है कि यह बुरा है, बस भाषा अन्यथा कर सकती थी। सी # में, आप class A extends B implements C, D और class A implements B, C, D दोनों के बजाय class A : B, C, D लिखते हैं। तो आप बस सोच सकते हैं कि स्कैला का extends कोलोन की तरह है और with अल्पविराम की तरह है।

फिर भी, पुराने समय में, यह class Bar with Foo होता था। जब 2006 में स्कैला 2.0 वापस चला गया तो यह बदल गया। the change history देखें।

मुझे लगता है मुझे याद है (यकीन नहीं) कि कारण यह था कि class Bar with Foo अच्छी तरह से पढ़ा नहीं गया है।

स्कैला में, A with BA और B के प्रकार का अंतर है। एक ऑब्जेक्ट A with B प्रकार है यदि यह A प्रकार और B प्रकार है। तो class A extends B with C पढ़ा जा सकता है class AB with C टाइप करता है। class A with B के साथ ऐसी कोई चीज़ नहीं है।

+0

अच्छी व्याख्या, धन्यवाद! – santiagobasulto

3

Programming in Scala (2nd ed)extends के अध्याय 12. यह संबंध नोटों में लक्षण पर चर्चा करता है:

आप एक विशेषता में मिश्रण करने कीवर्ड फैली उपयोग कर सकते हैं; उस स्थिति में आप स्पष्ट रूप से विशेषता के सुपरक्लास का उत्तराधिकारी हैं। उदाहरण के लिए, लिस्टिंग 12.2 में, कक्षा Frog सबक्लास AnyRef (Philosophical का सुपरक्लास) और Philosophical में मिलाता है।

(यहाँ, Philosophical एक विशेषता है।)

तो, अपने तर्क बिल्कुल सही है।

AnyRef के विषय पर, आपको Scala class hierarchy और top types के बारे में पढ़ना चाहिए। (AnyRef शीर्ष प्रकार नहीं है लेकिन यह बहुत करीब है।)

+0

मेरे पास यह पुस्तक है! मुझे यह याद क्यों आया? धन्यवाद @ एमिल – santiagobasulto

8

यदि आप जावा से आ रहे हैं, तो यह पहले अजीब लग सकता है (यह मेरे लिए समान था), लेकिन वास्तव में अब मुझे यह अधिक नियमित वाक्यविन्यास मिलता है जावा, जहां मुझे स्पष्ट रूप से यह कहना है कि मैं implement या extend अन्य कक्षा/इंटरफ़ेस चाहता हूं। लेकिन मुझे लगता है कि यह व्यक्तिगत स्वाद का अधिक सवाल है।

यह वास्तव में कोई फर्क नहीं पड़ता कि आप extends या implements कह रहे हैं। वे दोनों दो चीजों के बीच एक ही तरह के रिश्ते का प्रतिनिधित्व करते हैं: एक है (प्रतिनिधिमंडल और संरचना के विपरीत, जो का प्रतिनिधित्व करता है संबंध है)। यहाँ, उदाहरण के लिए, आप इसके बारे में कुछ और जानकारी पा सकते हैं:

http://www.javacamp.org/moreclasses/oop/oop5.html

बस extends, implements, withis a साथ बदलने के लिए कोशिश करते हैं और इसे और अधिक स्पष्ट हो जाता है।

स्कैला में आपके पास is a संबंधों की अन्य विविधताएं भी हैं। उदाहरण स्वयं प्रकार के लिए:

trait Bar { 
    self: Foo => 
    // ... 
} 
इस के साथ

आप कह रहे हैं, कि Bar/औजार फैली नहीं है Foo सीधे, लेकिन अन्य सभी वर्गों, कि Bar का विस्तार करना चाहते भी Foo का विस्तार करना चाहिए।

स्व प्रकार दिलचस्प चीजों को अनुमति दे सकता है। उदाहरण के लिए दो वर्गों/लक्षण है कि एक दूसरे पर निर्भर:

class Bar extends Foo { 
    def sayHello(name: String) = println("Hello, " + name) 

    greet() 
} 

trait Foo { 
    this: Bar => 

    def greet() = sayHello("User") 
} 

new Bar() // prints: Hello, User 
+0

यह भी देखें http://www.levinotik.com/2012/09/14/scala-abstract-classes-traits-and-self-types/ – ZiglioUK

+0

यह एक दिलचस्प उत्तर है, खासकर "स्वयं प्रकार" अंश। धन्यवाद! – asgs

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

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