class A def a puts 'in #a' end end class B < A def a b() end def b # here i want to call A#a. end end
cevap
class B < A
alias :super_a :a
def a
b()
end
def b
super_a()
end
end
Yapmanın iyi bir yolu yok, ancak işe yarayacak olan A.instance_method(:a).bind(self).call
'u yapabilirsiniz, ancak çirkin.
Hatta java süper gibi davranmak Nesne kendi yöntemini tanımlayabilirsiniz: Açıkça yerine B # b A # a diyorsunuz, ama gerek yoksa
class SuperProxy
def initialize(obj)
@obj = obj
end
def method_missing(meth, *args, &blk)
@obj.class.superclass.instance_method(meth).bind(@obj).call(*args, &blk)
end
end
class Object
private
def sup
SuperProxy.new(self)
end
end
class A
def a
puts "In A#a"
end
end
class B<A
def a
end
def b
sup.a
end
end
B.new.b # Prints in A#a
@klochner, bu çözüm ben ... gerekli nedeni tam olarak ne oldu: Ben farklı bir yöntemin jenerik çağrı süper yönteme istedi ama takma gerek kalmadan istediğim her biri muktedir Bunu yapmak için, süper çağırmak için genel bir yol oldukça yararlıdır –
Bir kez tanımlamak için karmaşık, bir çok kez çağırmak için basit. Bu tam tersi daha iyidir. – nertzy
gerek B # b üzerinden yaptığınız A # a kelimesini çağırmak için (örneğin siz B # b'den neden çektiğinizi göstermek için yeterli değilseniz) B/a'nın içinden süper arama, tıpkı kimi zaman başlatma metotlarında yapıldığı gibi, biliyorum ki bu açık bir şey, ben sadece takma adlara sahip olmadığınız herhangi bir Ruby yeni üyesi için açıklığa kavuşturmak istedim (özellikle buna bazen denir) her kutuda "takma ad") e. Ben katılmıyorum
class A
def a
# do stuff for A
end
end
class B < A
def a
# do some stuff specific to B
super
# or use super() if you don't want super to pass on any args that method a might have had
# super/super() can also be called first
# it should be noted that some design patterns call for avoiding this construct
# as it creates a tight coupling between the classes. If you control both
# classes, it's not as big a deal, but if the superclass is outside your control
# it could change, w/o you knowing. This is pretty much composition vs inheritance
end
end
- 1. Java: Başka bir sınıfta bir yöntem çağrılıyor
- 2. Aynı Sınıfta Dize Çağırma
- 3. Geçersiz bir yöntem çağırma
- 4. Süper yöntem nasıl aranır?
- 5. Java ile aynı adla aynı yöntemle başka bir yöntem çağırma
- 6. Başka bir yöntemden dize çağırma
- 7. Sınıfta başka bir yöntemin doğrulanması Moq
- 8. Bir hizmetten etkinlikte yöntem çağırma
- 9. Codeigniter: Görünümden bir yöntem çağırma
- 10. Başka bir sınıfta arayarak Repaint() yöntemi
- 11. Genel türünde yöntem çağırma?
- 12. Bir tarih seçildikten sonra yöntem çağırma seçilidir
- 13. Başka Sınıfta Başka Sınıf Fonksiyonu Aranıyor
- 14. Kullanıcı oturum açarken bir yöntem çağırma Django
- 15. NSTimer'den statik bir yöntem çağırma. Mümkün mü?
- 16. Android API'da özel (yayımlanmamış) bir yöntem çağırma
- 17. Değer üzerinde özel bir yöntem çağırma değişti
- 18. jvm yöntem çağırma geçmişi trace
- 19. Anonim (iç) sınıflarda yöntem çağırma
- 20. Boş güvenli Yöntem çağırma Java7
- 21. Android Facebook.authorize tamamlanmayan yöntem çağırma
- 22. Başka bir sınıftan bir değişken çağırma PHP
- 23. C++ sınıfından başka bir sınıfta kullanılan sınıf
- 24. java8: başka bir yöntem referansından yöntem başvurusu
- 25. Sadece bir sınıfta 2 karşılaştırılabilir yöntem nasıl yapabilirim?
- 26. Başka bir görünümden görünüm işlevi çağırma - Backbone
- 27. OCaml: Başka bir işlev içinde işlev çağırma
- 28. İlkbaharda hizmet sınıfından başka bir denetleyici çağırma
- 29. Test sonucu için JMockit üzerinden özel bir yöntem çağırma
- 30. PHP - bir sınıfta catchall yöntemi
bu alias' olarak değiştirilmiş 'mümkün mi http://stackoverflow.com/questions/2925016/alias-method-and-class-methods-dont-mix –
bkz sınıf yöntemi diğer adına [' alias_method'] Bu cevap yazıldığı için (http://apidock.com/ruby/Module/alias_method)? –
@JaredBeck gerçekten yeniden adlandırıldı. Yani şimdi olmalı: alias_method: super_a: –