2012-03-30 36 views
20

Trong Ruby, có thể đi về việc nhận được hằng số của trẻ khi tôi đã gọi phương thức của cha mẹ qua đứa trẻ không?Nhận hằng số con theo phương thức mẹ - Ruby

Ví dụ:

class Tester 
    class Parent 

    def go 
     EWOCK 
    end 
    end 

    class Child < Parent 
    EWOCK = "EWOCKS rule" 

    end 
end 

Sau đó gọi Tester::Child.new.go và "quy tắc EWOCKS" mong muốn quay trở lại?

[Chỉnh sửa 3/31]

Wow Tôi chàng trai thực sự xin lỗi. Tôi hoàn toàn vặn vẹo lời giải thích.

  • Cha mẹ phải là trẻ em và trẻ em nên được thừa hưởng từ cơ sở.
  • Cuộc gọi cần phải có được để trẻ em và không chuyên

Một lần nữa, nhiều lời xin lỗi và cảm ơn đến những người trả lời cố gắng hiểu writeup khủng của tôi.

Bây giờ nó đã được sửa.

+0

Ví dụ của bạn không hiển thị gọi phương thức của cha mẹ thông qua con. Tôi có hiểu lầm không? –

+0

@Wayne: Tôi đoán rằng 'Parent' nên thừa kế từ' Child' –

+0

@Wayne Conrad - thực sự xin lỗi, tôi đã cập nhật giải thích. – Justin

Trả lời

34

EDIT: câu trả lời này là chính xác, mặc dù Wayne là cách ruby-ish hơn để tiếp cận vấn đề.

Vâng.

Việc triển khai của bạn sẽ không hoạt động do cha mẹ cố gắng phân giải EWOK cục bộ. Phụ huynh không có EWOK được xác định. Tuy nhiên, bạn có thể yêu cầu Ruby nhìn cụ thể vào lớp của thể hiện thực tế mà phương thức đã được gọi, để có được EWOK.

này sẽ công việc:

class Parent 
    def go 
    self.class::EWOK 
    end 
end 

class Child < Parent 
    EWOK = "Ewoks Rule" 
end 

class Child2 < Parent 
    EWOK = "Ewoks are ok, I guess" 
end 

bob = Child.new 
bob.go # => "Ewoks Rule" 

joe = Child2.new 
joe.go # => "Ewoks are ok, I guess" 

gì đang xảy ra ở đây: trong phụ huynh 'đi', "tự" sẽ đề cập đến trường hợp của đối tượng đó đi 'thật sự đang được kêu gọi. tức là, bob (một đứa trẻ), hoặc joe (một Child2). self.class nhận lớp thực tế của cá thể đó - Child trong trường hợp bob, hoặc Child2 trong trường hợp joe. sau đó, self.class :: EWOK sẽ truy xuất EWOK từ lớp chính xác.

+0

Tuyệt.Tôi không biết rằng câu trả lời của tôi là cách Ruby nhiều hơn bạn. –

+1

Tôi nghĩ rằng nó thường thích hợp hơn để sử dụng vịt-gõ thông qua các phương pháp, như trái ngược với ma thuật độ phân giải lớp ưa thích trong lớp cha mẹ. Tuy nhiên, thỉnh thoảng có sử dụng cho nó. – YenTheFirst

+0

Đó là lý do tôi bỏ phiếu. Có nhiều cách để nuôi một con mèo. –

10

Để lớp cha có quyền truy cập vào hằng số được xác định trong lớp con, hãy bọc hằng số đó trong một phương thức. Sau đó, các quy tắc thừa kế bình thường áp dụng:

class Parent 

    def ewok 
    "Ewoks are lame" 
    end 

end 

class Child < Parent 

    def ewok 
    "Ewoks rule" 
    end 

end 

p Parent.new.ewok # Ewoks are lame 
p Child.new.ewok  # Ewoks rule 

Nếu hằng số là tốn kém để khởi tạo (một hash lớn, ví dụ), các định nghĩa nó trong một hằng số, nhưng truy cập nó thông qua một phương pháp:

class Parent 

    EWOK = { 
    # Enormous hash... 
    } 

    def ewok 
    EWOK 
    end 

end 
+0

Cũng có thể sử dụng biến lớp thay vì phương pháp. –

+0

@Niklas, True. Tôi đã dành phần tốt hơn trong một tuần, một lần, gỡ rối các mớ hỗn độn gây ra bởi việc sử dụng miễn phí các biến lớp. Họ là một công cụ tôi thích giữ đằng sau kính và dán nhãn "phá vỡ trong trường hợp khẩn cấp." –

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