2016-12-08 5 views
14

के साथ बनाम मैं उलझन में हूं। मैंने अपने मौजूदा प्रोजेक्ट में पाया। कुछ स्थानों extends और कुछ स्थानों with। मैं अलग-अलग खोजने में सक्षम नहीं हूं, कृपया मेरी मदद करें।स्कैला - बनाम

+0

विस्तार या ऑब्जेक्ट के लिए है जबकि इंटरफ़ेस या विशेषता – HuntsMan

+3

मार्टिन ओडर्स्की ने इस http://www.scala-lang.org/old/node/10145.html के लिए एक अच्छा जवाब लिखा है – raam86

उत्तर

10

स्कैला में, आप class ईएस (कंक्रीट या abstract) और trait एस से प्राप्त कर सकते हैं। इसी तरह से आप केवल एक वर्ग का विस्तार कैसे कर सकते हैं, लेकिन जावा में जितना चाहें उतने इंटरफेस को लागू कर सकते हैं, आपको केवल class से उत्तराधिकारी होने की अनुमति है, लेकिन जितनी चाहें उतनी trait एस।

यदि आप class का विस्तार कर रहे हैं, तो उस वर्ग को तुरंत extends कीवर्ड का पालन करना चाहिए। कोई भी trait एस आप का पालन करना चाहिए, with कीवर्ड से अलग होना चाहिए।

यदि आप कक्षा का विस्तार नहीं कर रहे हैं, तो आप extends कीवर्ड के ठीक बाद अपना पहला trait डाल सकते हैं और उसके बाद जारी रख सकते हैं।

जैसे ही जावा में, प्रत्येक वर्ग Object का उप-वर्ग है, चाहे आप इसे स्पष्ट रूप से घोषित करते हैं या नहीं, स्कैला extends AnyRef with ScalaObject में प्रत्येक (उपयोगकर्ता परिभाषित) कक्षा, चाहे आप स्पष्ट रूप से शामिल हों या नहीं।

घोषणाओं के निम्नलिखित सेट इसलिए बराबर हैं:

class MyClass { ... } 
class MyClass extends AnyRef with ScalaObject { ... } 

class MyClass extends MySuperClass { ... } 
class MyClass extends MySuperClass with ScalaObject { ... } 

class MyClass extends MyTrait1 with MyTrait2 { ... } 
class MyClass extends AnyRef with MyTrait1 with MyTrait2 { ... } 

class MyClass extends MySuperClass with MyTrait1 with MyTrait2 { ... } 

पिछले उदाहरण ही नहीं है अगर आप MySuperClass, MyTrait1, और MyTrait2 का क्रम बदलने के। विशेष रूप से, आप किसी वर्ग के सामने एक विशेषता नहीं लगा सकते हैं और जिस क्रम में आप स्टैक स्टैक करते हैं, वह महत्वपूर्ण है यदि दोनों के पास एक ही तरीके के लिए कार्यान्वयन हो। (उस स्थिति में, अंतिम "जीतता है।)

याद रखें कि स्कैला में केवल class es पैरामीटर हो सकते हैं, इसलिए आप कभी भी extends कीवर्ड के बाद पैरामीटर को अटैचमेंट करने में सक्षम होंगे, कभी नहीं with के बाद सूचीबद्ध किसी भी प्रकार का।

आशा है कि मदद करता है!

13

आप एक से अधिक class तों या trait रों वारिस है, तो पहले एक हमेशा extends है, और निम्नलिखित> = 0 class/traitwith रों किया जाना है।

लेकिन याद रखें कि आप केवल इनहेरिट < = 1 (सार) वर्ग है, जो यदि आप एक माता पिता के वर्ग (Parent) के वारिस की जरूरत का मतलब है, यह हमेशा प्रपत्र ... extends Parent ..., और कोई और अधिक कक्षाओं के पहले पर आता है चाहिए कर सकते हैं व्युत्पन्न वर्ग में विरासत में प्राप्त किया जा सकता है।

trait T1 
trait T2 
class P1 
class P2 

class C1 extends T1 
class C2 extends T1 with T2 
class C3 extends T2 with T1 
class C4 extends P1 with T1 
/// class C5 extends T1 with P1 // invalid 
/// class C6 extends P1 with P2 // invalid 

with वर्ग/ऐसी विशेषता है जो है extend एड, उदाहरण के लिए, class C7 extends P1 with T1 with T2 पढ़ता class C7 extends (P1 with T1 with T2) करने के लिए बाध्य है, वास्तव में है।

ध्यान दें कि यह वाक्य रचना के दृष्टिकोण से ही है, अर्थ मतभेद निम्नलिखित से भेजा जा सकता है:

  1. trait और (abstract) class के उपयोग here है ;
  2. संकल्प नियम तथाकथित class linearization है; a post about it है।
2

extends कीवर्ड का उपयोग करके आप जो पहली चीज प्राप्त करते हैं वह एक विशेषता या कक्षा हो सकती है।

trait SomeTrait 
class SomeClass 

class ThisIsValid extends SomeTrait 
class ThisAsWell extends SomeClass 

आप आगे विरासत में मिला परिभाषित कर सकते हैं लक्षण (और केवल लक्षण) with कीवर्ड का उपयोग।

class AlsoThisWorks extends SomeClass with SomeTrait 

यदि किसी वर्ग से प्राप्त एक विशेषता आप उपर्युक्त उदाहरण की तरह इसका उपयोग नहीं कर सकते हैं।

यह extends और with कीवर्ड के बारे में है। यदि आप classes और traits के बारे में अधिक जानना चाहते हैं तो आधिकारिक दस्तावेज विषय पर गहराई से चला जाता है।

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