Ưu điểm của việc sử dụng các đặc điểm trên các lớp trừu tượng là gì?


81

Ai đó có thể vui lòng giải thích các đặc điểm trong Scala? Ưu điểm của các đặc điểm so với việc mở rộng một lớp trừu tượng là gì?

Câu trả lời:


80

Câu trả lời ngắn gọn là bạn có thể sử dụng nhiều đặc điểm - chúng "có thể xếp chồng lên nhau". Ngoài ra, các đặc điểm không thể có tham số xây dựng.

Đây là cách các đặc điểm được xếp chồng lên nhau. Lưu ý rằng thứ tự của các tính trạng là quan trọng. Họ sẽ gọi nhau từ phải sang trái.

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
Việc thiếu các tham số hàm tạo hầu như được tạo ra bằng cách sử dụng các tham số kiểu trong các tính trạng.
Jus12

19

Trang web này đưa ra một ví dụ điển hình về việc sử dụng đặc điểm. Một lợi thế lớn của các đặc điểm là bạn có thể mở rộng nhiều đặc điểm nhưng chỉ có một lớp trừu tượng. Các đặc điểm giải quyết nhiều vấn đề với đa kế thừa nhưng cho phép sử dụng lại mã.

Nếu bạn biết ruby, các đặc điểm tương tự như mix-in


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) {
}
Đầu ra:

Danh sách (tôi là Ray
, Tôi là Ray, Đó là một ngày tồi tệ!
, Tôi là Ray, Đó là một ngày đẹp trời!
, Tôi là Ray, Đó là một ngày tồi tệ!
, Tôi là Ray, Đó là một ngày đẹp trời!
)



3

Các đặc điểm hữu ích để trộn chức năng vào một lớp. Hãy xem tại http://scalatest.org/ . Lưu ý cách bạn có thể kết hợp nhiều ngôn ngữ dành riêng cho miền (DSL) vào một lớp thử nghiệm. xem hướng dẫn bắt đầu nhanh để xem một số DSL được hỗ trợ bởi Scalatest ( http://scalatest.org/quick_start )


1

Tương tự như các giao diện trong Java, các đặc điểm được sử dụng để xác định các kiểu đối tượng bằng cách chỉ định chữ ký của các phương thức được hỗ trợ.

Không giống như Java, Scala cho phép các đặc điểm được thực hiện một phần; tức là có thể xác định các triển khai mặc định cho một số phương thức.

Ngược lại với các lớp, các đặc điểm có thể không có tham số khởi tạo. Các đặc điểm giống như các lớp, nhưng xác định một giao diện của các chức năng và trường mà các lớp có thể cung cấp các giá trị và triển khai cụ thể.

Các đặc điểm có thể kế thừa từ các đặc điểm khác hoặc từ các lớp.


1

Tôi đang trích dẫn từ trang web của cuốn sách Lập trình trong Scala, Ấn bản đầu tiên và cụ thể hơn là phần có tên " To trait, or not to trait? " Từ Chương 12.

Bất cứ khi nào bạn triển khai một tập hợp hành vi có thể tái sử dụng, bạn sẽ phải quyết định xem bạn muốn sử dụng một đặc điểm hay một lớp trừu tượng. Không có quy tắc chắc chắn, nhưng phần này có một số nguyên tắc cần xem xét.

Nếu hành vi sẽ không được sử dụng lại, thì hãy biến nó thành một lớp cụ thể. Rốt cuộc, nó không phải là hành vi có thể tái sử dụng.

Nếu nó có thể được sử dụng lại trong nhiều lớp, không liên quan, hãy biến nó thành một đặc điểm. Chỉ các tính trạng có thể được trộn lẫn vào các phần khác nhau của hệ thống phân cấp lớp.

Có thêm một chút thông tin trong liên kết trên về các đặc điểm và tôi khuyên bạn nên đọc phần đầy đủ. Tôi hi vọng cái này giúp được.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.