2012-03-30 21 views
20

Czy w Ruby można uzyskać stałe dziecko, gdy zadzwonię do metody rodzica przez dziecko?Uzyskaj stałą dziecka w metodzie rodzica - Ruby

Przykład:

class Tester 
    class Parent 

    def go 
     EWOCK 
    end 
    end 

    class Child < Parent 
    EWOCK = "EWOCKS rule" 

    end 
end 

Następnie zadzwonić Tester::Child.new.go i pożądanie "EWOCKS regułę", aby wrócić?

[Edytuj 3/31]

Wow Naprawdę przepraszam chłopaki. Całkowicie spieprzyłem wyjaśnienie.

  • Rodzic powinien być dzieckiem, a dziecko powinno odziedziczyć bazę.
  • Wezwanie powinno być na dziecko i nie nadrzędna

Ponownie wiele przeprosiny i podziękowania dla tych, którzy odpowiedzieli próbując zrozumieć moją okropną writeup.

Zostało to naprawione.

+0

Twój przykład nie pokazuje wywoływania metody rodzica przez dziecko. Czy źle zrozumiałem? –

+0

@Wayne: Myślę, że 'Parent' powinien odziedziczyć po' Child'u –

+0

@Wayne Conrad - naprawdę przykro mi, zaktualizowałem wyjaśnienie. – Justin

Odpowiedz

34

EDYCJA: ta odpowiedź jest poprawna, chociaż Wayne's jest bardziej rubinowym sposobem podejścia do problemu.

Tak jest.

Twoje wdrożenie będzie nie pracy, ponieważ rodzic próbuje rozwiązać EWOK lokalnie. Rodzic nie ma zdefiniowanych EWO. Możesz jednak powiedzieć Ruby, aby spojrzała konkretnie na klasę instancji, na którą została wywołana, aby uzyskać EWOK.

to będzie praca:

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" 

co się dzieje tutaj: w rodzica „go”, „ja” będzie odnosić się do instancji obiektu, który „Go” jest faktycznie wezwał. tj. Bob (dziecko) lub joe (dziecko2). self.class pobiera rzeczywistą klasę tej instancji - Child w przypadku boba lub Child2 w przypadku joe. , wtedy self.class :: EWOK pobierze EWOK z właściwej klasy.

+0

Nice.Nie wiem, że moja odpowiedź jest bardziej droga Ruby niż twoja. –

+1

Myślę, że generalnie lepiej jest używać kaczych piszących metodami, w przeciwieństwie do fantazyjnej magii rozwiązywania klas w klasie nadrzędnej. Istnieją jednak okazjonalne zastosowania. – YenTheFirst

+0

Dlatego właśnie głosowałem za. Jest więcej niż jeden sposób na skórze kota. –

10

Aby klasa nadrzędna miała dostęp do stałej zdefiniowanej w klasie potomnej, należy zawijać tę stałą w metodzie. Następnie stosuje się normalne zasady dziedziczenia:

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 

Jeśli stała jest drogie, aby zainicjować (duży skrót, na przykład), przy czym określenie to w stałą, ale dostęp to za pomocą metody:

class Parent 

    EWOK = { 
    # Enormous hash... 
    } 

    def ewok 
    EWOK 
    end 

end 
+0

Można również użyć zmiennych klasowych zamiast metod. –

+0

@Niklas, True. Spędziłem większą część tygodnia, raz, rozplątując bałagan spowodowany swobodnym użyciem zmiennych klasowych. Są narzędziem, które wolę trzymać za szkłem i nazywać się "break in emergency". –

Powiązane problemy