2016-12-10 25 views
5

अक्का जानने के लिए प्रयास करते समय, मैं अक्सर इस के समान एक वर्ग पदानुक्रम के साथ उदाहरण पाते हैं:अंतर

sealed trait Message 

case class TextMessage(user: String, text: String) extends Message 
case class StatusMessage(status: String) extends Message 

हालांकि, यानी Scala docs में एक निम्न उदाहरण नहीं है :

abstract class Notification 

case class Email(sourceEmail: String, title: String, body: String) extends Notification 
case class SMS(sourceNumber: String, message: String) extends Notification 
case class VoiceRecording(contactName: String, link: String) extends Notification 

एक वर्ग पदानुक्रम के लिए निर्माता पैरामीटर के बिना एक आधार वर्ग के रूप में एक अमूर्त वर्ग (या इस मामले में सील सार वर्ग) बनाम एक सील विशेषता का प्रयोग करने में क्या अंतर है? क्या दूसरे पर एक का उपयोग करने में कुछ फायदे हैं?

संपादित करें:

विशेष रूप से, दोनों हैं, विशेषता और अमूर्त वर्ग सिले हुए हैं, मैं उन्हें फ़ाइल के बाहर, सही विस्तार नहीं कर सकते? उस मामले में मैं जावा में उनसे भी उत्तराधिकारी नहीं हो सका? यदि मामला मुहरबंदता the suggested duplicate में पाए गए अधिकांश तर्क प्रस्तुत करेगी क्योंकि वे फ़ाइल के बाहर विरासत को संदर्भित करते हैं।

+3

की संभावित डुप्लिकेट [लक्षण के बजाय सार वर्गों का उपयोग करने का लाभ यह है क्या?] (http: // stackoverflow। कॉम/प्रश्न/1991042/किस-का-लाभ-का-उपयोग-अमूर्त-वर्ग-बदले में गुण) –

+1

स्कैला जावा इंटरऑप का समर्थन करने की आवश्यकता नहीं होने पर एक बहुत ही सरल और बेहतर भाषा होगी। लोगों के लिए भी सीखना आसान होगा। –

+0

[यह] (http://stackoverflow.com/questions/35249901/scala-client-composition-with-traits-vs-implementing-an-abstract-class/35251513#35251513) पढ़ने के लायक भी है। – jwvh

उत्तर

6

इस विशेष मामले में कोई अंतर नहीं है सिवाय इसके कि आप एकाधिक abstract classes का विस्तार नहीं कर सकते हैं लेकिन आप एकाधिक traits का विस्तार कर सकते हैं।

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

उदा। आप निम्न के किए जा सकेंगे:

trait A 
trait B 

case class C(a: Int) extends A with B 

लेकिन आप ऐसा नहीं कर सकते:

abstract class A 
abstract class B 

case class C(a: Int) extends A with B