Giả sử tôi có một mô-đun được gọi là Flight
với cả phương thức lớp và phương pháp mẫu. Tôi có thể lấy phương thức của nó vào một lớp học sử dụng include
, extend
, hoặc cả hai:Tại sao mô-đun thừa kế Ruby không hoạt động như kế thừa lớp?
class Bat < Mammal
# Add Flight's class methods to Bat.
extend Flight
# Add Flight's instance methods to Bat.
include Flight
...
end
include
sẽ thêm Flight
để Bat.ancestors
, nhưng extend
sẽ không.
Câu hỏi của tôi là, tại sao điều này khác với mô-đun so với các lớp học? Khi tôi phân lớp Mammal
, tôi luôn luôn nhận cả hai phương thức lớp và dụ cùng một lúc. Tuy nhiên, khi tôi trộn vào một mô-đun, tôi không thể nhận cả hai phương thức lớp và dụ cùng một lúc (trừ khi tôi sử dụng móc self.included
hoặc thứ gì đó như ActiveSupport::Concern).
Có vấn đề về thiết kế ngôn ngữ nào đằng sau sự khác biệt này không?
Vâng, phải có một số khác biệt để biện minh cho sự tồn tại của một riêng biệt thực thể, phải không? :) –