2009-05-12 31 views
8

Tôi đã đọc một cuốn sách về Scala và có đề cập đến sửa đổi có thể xếp chồng sử dụng các đặc điểm. sửa đổi có thể xếp chồng là gì và chúng có ý nghĩa gì để sử dụng?Sửa đổi stackable là gì?

+0

Cuốn sách giải thích nó trong chương đặc điểm. – Rayne

Trả lời

8

Chất lượng cơ bản phân biệt các thay đổi có thể xếp chồng (vì thuật ngữ được sử dụng trong scala anyway) là "siêu" bị ảnh hưởng động dựa trên cách tính trạng được trộn lẫn, trong khi siêu chung là mục tiêu được xác định tĩnh.

Nếu bạn viết

abstract class Bar { def bar(x: Int): Int } 
class Foo extends Bar { def bar(x: Int) = x } 

sau đó cho Foo "siêu" sẽ luôn là Bar.

Nếu bạn viết

trait Foo1 extends Foo { abstract override def bar(x: Int) = x + super.bar(x) } 

Sau đó, cho rằng phương pháp siêu vẫn chưa được biết cho đến khi lớp được thực hiện.

trait Foo2 extends Foo { abstract override def bar(x: Int) = x * super.bar(x) } 

scala> (new Foo with Foo2 with Foo1).bar(5) 
res0: Int = 30 

scala> (new Foo with Foo1 with Foo2).bar(5) 
res1: Int = 50 

Tại sao điều này lại thú vị? Một ví dụ minh họa có thể là một số dữ liệu mà bạn muốn nén, mã hóa và ký điện tử. Bạn có thể muốn nén sau đó mã hóa rồi ký, hoặc bạn có thể muốn mã hóa rồi ký tên rồi nén, vv Nếu bạn thiết kế các thành phần theo cách này, bạn có thể tạo một đối tượng tùy chỉnh với chính xác các bit bạn muốn sắp xếp theo cách bạn muốn.

+0

Chỉ vì lợi ích của sự thanh lịch "đặc điểm Foo1 mở rộng Bar" thay vì "đặc điểm Foo1 mở rộng Foo"? –

+0

Boris - bạn hoàn toàn đúng, nó chỉ được viết theo cách nó là bởi vì tôi đã thêm Bar vào phút cuối. – extempore

1

Tôi đã xem Real-World Scala presentation trong đó thuật ngữ sửa đổi có thể xếp chồng cũng được sử dụng. Rõ ràng đó là những đặc điểm gọi phương thức siêu khi ghi đè, về cơ bản thêm chức năng và không thay thế nó. Vì vậy, bạn tích lũy chức năng với các đặc điểm, và nó có thể được sử dụng trong Java, chúng tôi thường sử dụng các khía cạnh. Trait đóng vai trò của một khía cạnh, ghi đè các phương pháp "thú vị" và thêm các chức năng cụ thể như ghi nhật ký vv và sau đó gọi siêu và "chuyền bóng" cho đặc điểm tiếp theo trong chuỗi. HTH.

+0

Thật tuyệt vời! – egaga

Các vấn đề liên quan