Mixins so với đặc điểm


Câu trả lời:


214
  1. Mixins có thể chứa trạng thái, đặc điểm (truyền thống) không.
  2. Mixins sử dụng "giải quyết xung đột ngầm", các đặc điểm sử dụng "giải quyết xung đột rõ ràng"
  3. Mixins phụ thuộc vào tuyến tính hóa, các đặc điểm được làm phẳng.

Bài giảng về đặc điểm

quảng cáo 1. Trong mixins, bạn có thể xác định các biến thể hiện. Đặc điểm không cho phép điều này. Trạng thái phải được cung cấp bằng cách soạn lớp (= class bằng các đặc điểm)

quảng cáo 2. Có thể có xung đột tên. Hai mixin ( MAMB) hoặc đặc điểm ( TATB) xác định phương thức có cùng định nghĩa foo():void.

Mixin MA {
    foo():void {
        print 'hello'
    }
}

Mixin MB {
    foo():void {
        print 'bye'
    }
}

Trait TA {
    foo():void {
        print 'hello'
    }
}

Trait TB {
    foo():void {
        print 'bye'
    }
}

Trong mixins, các xung đột trong lớp soạn thảo C mixins MA, MB được giải quyết hoàn toàn.

Class C mixins MA, MB {
    bar():void {
        foo();
    }
}

Cái này sẽ gọi foo():voidtừMA

Mặt khác, trong khi sử dụng Đặc điểm, lớp soạn thảo phải giải quyết xung đột.

Class C mixins TA, TB {
    bar():void {
        foo();
    }
}

Mã này sẽ gây ra xung đột (hai định nghĩa về foo():void).

quảng cáo 3. Ngữ nghĩa của một phương thức không phụ thuộc vào việc nó được định nghĩa trong một đặc điểm hay trong một lớp sử dụng đặc điểm đó.

Nói cách khác, không có vấn đề gì khi lớp bao gồm các Đặc điểm hoặc mã Traits là "sao chép - dán" vào lớp.


5
Tôi biết đó là một ngày đã qua, nhưng đối với những độc giả tương lai, trong ruby, nó sẽ sử dụng phương thức tạo thành mô-đun cuối cùng được trộn lẫn, vì vậy nó sẽ gọi foo () từ MB
rik.vanmechelen

4
trong các đặc điểm Scala có thể có các trường, điều này ngụ ý chúng không phải là các đặc điểm "truyền thống"?
Sergio

4
Vâng, đây không phải là những đặc điểm "truyền thống", chúng được gọi là những đặc điểm "hoàn hảo". Sự khác biệt giữa các đặc điểm hoàn hảo và mixin là điểm 2 và 3.
jk_

7
Dự kiến ​​-1; cách các thuật ngữ 'đặc điểm' và 'mixin' được sử dụng trong tự nhiên rất không nhất quán và ít nhất một trong những điểm ở đây hầu hết là sai. PHP và Wikipedia (và theo @Sergio, cũng là Scala) không đồng ý với bạn về những đặc điểm không quốc tịch. Tôi không thấy câu trả lời này hữu ích vì nó được tạo thành từ những lời khẳng định trần trụi và với tôi không rõ ràng rằng đây là bất cứ điều gì nhiều hơn là cách cá nhân bạn sử dụng những từ này. Để được thuyết phục theo cách khác, tôi cần xem nhiều ví dụ về cách sử dụng thuật ngữ trong thế giới thực (ví dụ: bằng ngôn ngữ lập trình thực) để sao lưu các khiếu nại của bạn.
Đánh dấu Amery

3
@AykutKllic Tuyến tính hóa -> "Trình biên dịch giải quyết câu hỏi siêu là gì, không có sự mơ hồ." ( Ibm.com/developerworks/library/j-jn8 )
ben

9

Các trang này giải thích sự khác biệt trong ngôn ngữ lập trình D.

http://dlang.org/mixin.html

http://dlang.org/traits.html

Mixins trong bối cảnh này là mã được tạo ra một cách nhanh chóng, và sau đó được chèn tại điểm đó trong mã trong quá trình biên dịch. Khá tiện dụng cho DSL đơn giản.

Các đặc điểm là các giá trị bên ngoài thời gian biên dịch (chứ không phải mã được tạo từ nguồn bên ngoài). Sự khác biệt là tinh tế. Mixins thêm logic, Traits thêm dữ liệu như thông tin loại thời gian biên dịch.

Không biết nhiều về Ruby, nhưng hy vọng điều này sẽ giúp ích phần nào.


41
Mixins và Traits in D hoàn toàn khác với các thuật ngữ trong Khoa học máy tính nói chung. Trong D, cả hai đều là các nguyên hàm tiền xử lý để tạo mã tự động. Trong các ngôn ngữ khác, chúng là cơ chế kế thừa. Quyết định đặt tên trong D là không may.
tylerl
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.