2012-09-17 33 views
7

Xét là gì:sự khác biệt giữa tĩnh và đặc điểm năng động mixins

abstract class Base { 
    def something() = println("Base") 
} 

trait TraitA extends Base { 
    abstract override def something() = { super.something(); println("TraitA"); } 
} 

class Child extends Base { 
    override def something() { 
     println("Child") 
    } 
} 

Và sau đó:

val x = new Child with TraitA 
x.something() 

tôi nhận được:

Child 
TraitA 

Nhưng nếu tôi sử dụng:

class Child extends Base with TraitA { 
    override def something() { 
     println("Child") 
    } 
} 

val x = new Child 
x.something() 

tôi chỉ nhận được:

Child 

Vì vậy, các differentes của việc sử dụng một đặc điểm ở công trường xây dựng hoặc trang web tuyên bố là gì? Tôi có thể có hành vi đầu tiên (các đặc điểm có thể xếp chồng) trong khi mở rộng/với tính cách trong tuyên bố của lớp không?

Trả lời

5

Đặc điểm có thể xếp chồng trong Scala đề cập đến việc có thể kết hợp nhiều đặc điểm để cùng nhau áp dụng nhiều sửa đổi cho phương pháp. Điều này bao gồm việc gọi super.theMethod và sửa đổi đầu vào của nó và/hoặc đầu ra . Nhưng những gì là siêu trong bối cảnh của một đặc điểm? Lớp học (hoặc đặc điểm) đặc điểm kéo dài từ đâu? Lớp đặc điểm đang được trộn vào? Nó phụ thuộc! Tất cả các đặc tính hỗn hợp và tất cả các siêu lớp được được tuyến tính hóa. siêu gọi định nghĩa trước gần nhất tiếp tục tăng thêm chuỗi.

read full post

Trong trường hợp của bạn:
1. super.something() == Child.something()
2. super.something() == Base.something() và trẻ em. một cái gì đó() sẽ ghi đè toàn bộ chuỗi

Loại mixin không quan trọng:

class Child2 extends Child with TraitA 

val x2 = new Child2 
x2.something() 
/* 
    Child 
    TraitA 
*/ 

class Child3 extends Base with TraitA 
val x3 = new Child3 
x3.something() 
/* 
    Base 
    TraitA 
*/ 
2

Trong ví dụ đầu tiên, bạn ghi đè phương thức Base trước và sau đó bạn trộn TraitA sẽ chồng.

Trong ví dụ thứ hai, trước tiên bạn trộn TraitA và sau đó bạn ghi đè phương thức kết quả (xếp chồng).

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