ما هي إيجابيات استخدام الصفات على فئات مجردة؟

StackOverflow https://stackoverflow.com/questions/1229743

  •  22-07-2019
  •  | 
  •  

سؤال

ويمكن للشخص الرجاء شرح الصفات في سكالا؟ ما هي مزايا الصفات على توسيع فئة مجردة؟

هل كانت مفيدة؟

المحلول

والجواب القصير هو أنه يمكنك استخدام الصفات متعددة - فهي "تكويم". أيضا، يمكن أن الصفات لا يكون المعلمات المنشئ.

وهنا كيف مكدسة الصفات. لاحظ أن ترتيب الصفات مهمة. وسوف الاتصال ببعضهم البعض من اليمين إلى اليسار.

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
  }
}

نصائح أخرى

يعطي مثالا جيدا لاستخدام الصفة. ميزة واحدة كبيرة من الصفات هي أنك يمكن أن تمتد الصفات متعددة ولكن فئة مجردة واحد فقط. الصفات حل العديد من المشاكل مع وراثة متعددة ولكن تسمح إعادة استخدام التعليمات البرمجية.

إذا كنت تعرف روبي، والصفات مماثلة لمزيج الإضافية

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) {
}
Output :

List(I am Ray
, I am Ray, It is a bad day!
, I am Ray, It is a beautiful day!
, I am Ray, It is a bad day!
, I am Ray, It is a beautiful day!
)

وهذا هو أفضل سبيل المثال رأيت

وسكالا في الممارسة: تأليف الصفات - أسلوب ليغو: HTTP: //gleichmann.wordpress. كوم / 2009/10/21 / سكالا في والممارسة تأليف-سمات-ليغو على غرار /

    class Shuttle extends Spacecraft with ControlCabin with PulseEngine{

        val maxPulse = 10

        def increaseSpeed = speedUp
    }

وصفات مفيدة لخلط وظائف في فئة. نلقي نظرة على http://scalatest.org/ . لاحظ كيف يمكنك خلط في مختلف اللغات مجال معين (DSL) في فئة اختبار. إلقاء نظرة على دليل البدء السريع للنظر في بعض DSL المدعومة من قبل Scalatest ( http://scalatest.org/quick_start)

وعلى غرار واجهات في جاوة، وتستخدم الصفات لتحديد أنواع الكائنات لتحديد التوقيع على الطرق المدعمة.

وعلى عكس جافا، سكالا يسمح الصفات التي سيتم تنفيذها جزئيا. أي أنه من الممكن تحديد التطبيقات الافتراضية لبعض الأساليب.

وعلى النقيض من الطبقات، والصفات قد لا يكون المعلمات المنشئ. الصفات هي مثل الطبقات، ولكن التي تحدد واجهة من وظائف والحقول التي الطبقات يمكن أن العرض القيم وتطبيقات ملموسة.

ويمكن أن الصفات ترث من الصفات الأخرى أو من الطبقات.

وأنا نقلا عن الموقع الإلكتروني للكتاب <قوية> البرمجة في سكالا، الطبعة الأولى ثم على نحو أكثر تحديدا القسم المسمى "<لأ href =" http://www.artima.com/pins1ed/traits هتمل # 12.7 "يختلط =" نوفولو "> لسمة، أو عدم الصفة؟ " من الفصل 12.

<اقتباس فقرة>   

وكلما قمت بتطبيق مجموعة قابلة لإعادة الاستخدام من السلوك، وعليك أن تقرر ما إذا كنت تريد استخدام سمة أو فئة مجردة. ليس هناك قاعدة ثابتة، ولكن يحتوي هذا القسم بعض المبادئ التوجيهية للنظر فيها.

     

إذا لن يتم استخدامها السلوك، ثم جعله فئة محددة. وليس من السلوك يمكن إعادة استخدامها بعد كل شيء.

     

إذا كان يمكن استخدامها في عدة فئات لا علاقة لها، وجعلها سمة. الصفات الوحيدة التي يمكن أن تكون مختلطة في أجزاء مختلفة من التسلسل الهرمي فئة.

وهناك أكثر قليلا من المعلومات في الرابط أعلاه فيما يتعلق الصفات وأقترح عليك قراءة المقطع الكامل. آمل أن يساعد هذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top