2010-07-12 39 views
10

tôi vẫn không thể tìm ra cách để làm cho một constructor lớp con theo mẹ của nó ...
dụ:Thừa kế phương thức khởi tạo() trong ruby?

require 'mechanize' 

class Scraper 
    attr_accessor :agent 

    def initialize 
    # I dont know if using instance variable is the right thing to do 
    @agent = Mechanize.new 
    end 
end 

class ScraperA < Scraper 
end 

Tôi muốn làm ScraperA theo hành vi constructor mẹ,
đó là khởi tạo đối tượng Cơ chế mà không cần tôi gõ lại Mechanize.new trong Phương thức khởi tạo ScraperA(). Điều này có thể không?

Chỉ muốn tuân theo nguyên tắc DRY nhưng ruby ​​gây khó khăn cho tôi ???
Hy vọng không, có lẽ đó chỉ là sự thiếu hiểu biết của tôi. Mong chờ giải pháp đơn giản, Tnx.

Edit:
nó quay ra rằng tôi đã có phương pháp() trong ScraperA, mà ghi đè lên khởi tạo mặc định khởi tạo rỗng(). Vì vậy, vâng ví dụ đang hoạt động, bởi vì không có phương thức khởi tạo trống ở đó. Xin lỗi vì sự ngu ngốc của tôi. Tnx.

+0

Mã của bạn hoạt động như bạn muốn. Nếu bạn đã thử chạy mã đó chính xác, có thể là do bạn đang sử dụng phiên bản ruby ​​lỗi thời. – Adrian

+0

@Adrian: Tôi không nghĩ có bất kỳ phiên bản ruby ​​nào không hoạt động. – sepp2k

+3

Tại sao điều này đóng lại là 'Quá địa phương hóa'? – 0112

Trả lời

27

Umm ... eh? Có nó không ... Hãy kiểm tra điều này:

class A 
    def initialize 
    @a = "foo" 
    end 
end 

class B < A 
    def to_s 
    @a 
    end 
end 

puts B.new 
# "foo" is printed 

Điều này hoạt động vì initialize được kế thừa, giống như bất kỳ phương pháp nào khác. Nếu bạn ghi đè bằng cách có phụ đề mới initialize, thiết bị sẽ ngừng hoạt động. Sau đó, bạn có thể sử dụng rõ ràng super để gọi số initialize của phụ huynh.

12

này nên làm việc ...

class ScraperA < Scraper 

    def initialize 
    super 

    # do other stuff here if necessary 
    end 

end 

... nếu bạn muốn có logic khác cho lớp con. Như ý kiến ​​nói rằng nếu constructor là chính xác giống như cho lớp cha mẹ mã ban đầu của bạn nên làm việc tốt.

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