2013-09-08 33 views
13

Câu hỏi này liên quan trực tiếp đến this one. Nhưng tôi đã cố gắng chia nhỏ nó thành vấn đề cơ sở và tôi không muốn nhập thêm văn bản vào hộp câu hỏi khác. Vì vậy, ở đây đi:Làm thế nào để thêm vào các phân lớp

Tôi biết rằng tôi có thể bao gồm classmethods bằng cách mở rộng mô-đun ClassMethods và bao gồm nó thông qua Module # include hook. Nhưng tôi có thể làm tương tự với giao diện người dùng không? Dưới đây là ví dụ của tôi:

lớp Foo:

class Foo 
    def self.bar 
    'Base Bar!' 
    end 
end 

lớp Extensions:

module Extensions 
    module ClassMethods 
    def bar 
     'Extended Bar!' 
    end 
    end 

    def self.prepended(base) 
    base.extend(ClassMethods) 
    end 
end 
# prepend the extension 
Foo.send(:prepend, Extensions) 

lớp FooE:

require './Foo' 

class FooE < Foo 
end 

và startscript đơn giản:

require 'pry' 
require './FooE' 
require './Extensions' 

puts FooE.bar 

Khi tôi bắt đầu tập lệnh, tôi không nhận được Extended Bar! như tôi mong đợi nhưng thay vì Base Bar!. Tôi cần thay đổi gì để hoạt động bình thường?

Trả lời

18

Vấn đề là ngay cả khi bạn thêm vào trước các mô-đun, ClassMethods vẫn nhận được extend ed trong Bạn có thể làm điều này để có được những gì bạn muốn:.

module Extensions 
    module ClassMethods 
    def bar 
     'Extended Bar!' 
    end 
    end 

    def self.prepended(base) 
    class << base 
     prepend ClassMethods 
    end 
    end 
end 

Lưu ý rằng Extensions bản thân có thể là một trong hai được thêm vào trước hoặc được bao gồm trong Foo. Phần quan trọng đang chờ trước ClassMethods.

+0

Very nice! Cảm ơn rất nhiều. Rõ ràng là tôi không biết những gì mở rộng. – Nessuno

+0

Tuyệt vời, cảm ơn ... – Fabio

24

Một phiên bản đơn giản hơn:

module Extensions 
    def bar 
    'Extended Bar!' 
    end 
end 

Foo.singleton_class.prepend Extensions 
+1

Cảm ơn, rất đơn giản khi bạn nhìn thấy nó ... – 244an

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