अमूर्त वर्गों पर लक्षणों का उपयोग करने के क्या नियम हैं?


81

क्या कोई स्काला में लक्षण समझा सकता है? एक अमूर्त वर्ग का विस्तार करने में लक्षण क्या हैं?

जवाबों:


80

संक्षिप्त उत्तर यह है कि आप कई लक्षणों का उपयोग कर सकते हैं - वे "स्टैकेबल" हैं। इसके अलावा, लक्षण में निर्माता पैरामीटर नहीं हो सकते।

यहां बताया गया है कि कैसे लक्षण हैं। ध्यान दें कि लक्षणों का क्रम महत्वपूर्ण है। वे एक दूसरे को दाएं से बाएं बुलाएंगे।

class Ball {
  def properties(): List[String] = List()
  override def toString() = "It's a" +
    properties.mkString(" ", ", ", " ") +
    "ball"
}

trait Red extends Ball {
  override def properties() = super.properties ::: List("red")
}

trait Shiny extends Ball {
  override def properties() = super.properties ::: List("shiny")
}

object Balls {
  def main(args: Array[String]) {
    val myBall = new Ball with Shiny with Red
    println(myBall) // It's a shiny, red ball
  }
}

4
निर्माण के मापदंडों की कमी लगभग लक्षणों में प्रकार के मापदंडों का उपयोग करके बनाई गई है।
जुस 12

19

यह साइट विशेषता उपयोग का एक अच्छा उदाहरण देती है। लक्षणों का एक बड़ा फायदा यह है कि आप कई लक्षण बढ़ा सकते हैं लेकिन केवल एक सार वर्ग। लक्षण कई विरासत के साथ कई समस्याओं को हल करते हैं लेकिन कोड का पुन: उपयोग करने की अनुमति देते हैं।

यदि आप रूबी जानते हैं, तो लक्षण मिक्स-इन्स के समान हैं


5
package ground.learning.scala.traits

/**
 * Created by Mohan on 31/08/2014.
 *
 * Stacks are layered one top of another, when moving from Left -> Right,
 * Right most will be at the top layer, and receives method call.
 */
object TraitMain {

  def main(args: Array[String]) {
    val strangers: List[NoEmotion] = List(
      new Stranger("Ray") with NoEmotion,
      new Stranger("Ray") with Bad,
      new Stranger("Ray") with Good,
      new Stranger("Ray") with Good with Bad,
      new Stranger("Ray") with Bad with Good)
    println(strangers.map(_.hi + "\n"))
  }
}

trait NoEmotion {
  def value: String

  def hi = "I am " + value
}

trait Good extends NoEmotion {
  override def hi = "I am " + value + ", It is a beautiful day!"
}

trait Bad extends NoEmotion {
  override def hi = "I am " + value + ", It is a bad day!"
}

case class Stranger(value: String) {
}
आउटपुट:

सूची (मैं हूँ रे)
, मैं रे, यह एक बुरा दिन है!
, मैं रे, यह एक सुंदर दिन है!
, मैं रे, यह एक बुरा दिन है!
, मैं रे, यह एक सुंदर दिन है!
)



3

कार्यक्षमता एक वर्ग में कार्यक्षमता के मिश्रण के लिए उपयोगी है। Http://scalatest.org/ पर एक नज़र डालें । ध्यान दें कि आप विभिन्न डोमेन-विशिष्ट भाषाओं (DSL) को एक परीक्षण वर्ग में कैसे मिला सकते हैं। Scalatest ( http://scalatest.org/quick_art ) द्वारा समर्थित कुछ DSL को देखने के लिए त्वरित प्रारंभ गाइड देखें


1

जावा में इंटरफेस के समान, समर्थित विधियों के हस्ताक्षर को निर्दिष्ट करके ऑब्जेक्ट प्रकार को परिभाषित करने के लिए लक्षण का उपयोग किया जाता है।

जावा के विपरीत, स्काला लक्षणों को आंशिक रूप से कार्यान्वित करने की अनुमति देता है; यानी कुछ तरीकों के लिए डिफ़ॉल्ट कार्यान्वयन को परिभाषित करना संभव है।

वर्गों के विपरीत, लक्षण में निर्माता पैरामीटर नहीं हो सकते हैं। लक्षण कक्षाओं की तरह हैं, लेकिन जो फ़ंक्शन और फ़ील्ड के इंटरफ़ेस को परिभाषित करते हैं जो कक्षाएं ठोस मूल्यों और कार्यान्वयन की आपूर्ति कर सकती हैं।

लक्षण अन्य लक्षणों से या कक्षाओं से विरासत में मिल सकते हैं।


1

मैं अध्याय 12 में स्कैला, प्रथम संस्करण में प्रोग्रामिंग की वेबसाइट और विशेष रूप से " To trait, or not to trait? " नामक खंड से उद्धृत कर रहा हूं ।

जब भी आप व्यवहार के एक पुन: प्रयोज्य संग्रह को लागू करते हैं, तो आपको यह तय करना होगा कि आप किसी विशेषता या सार वर्ग का उपयोग करना चाहते हैं। कोई ठोस नियम नहीं है, लेकिन इस खंड में विचार करने के लिए कुछ दिशानिर्देश हैं।

यदि व्यवहार का पुन: उपयोग नहीं किया जाएगा, तो इसे एक ठोस वर्ग बनाएं। यह सब के बाद पुन: प्रयोज्य व्यवहार नहीं है।

यदि इसे कई, असंबद्ध वर्गों में पुन: उपयोग किया जा सकता है, तो इसे एक विशेषता बनाएं। केवल लक्षण वर्ग पदानुक्रम के विभिन्न भागों में मिलाए जा सकते हैं।

लक्षणों के संबंध में उपरोक्त लिंक में थोड़ी और जानकारी है और मेरा सुझाव है कि आप पूरा खंड पढ़ें। आशा है कि ये आपकी मदद करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.