kelas A def yang menempatkan 'di #a' end endkelas B < A def yang b() end def b
di sini saya ingin memanggil#a.
end end
Ada's tidak ada cara yang baik untuk melakukannya, tetapi anda dapat melakukan A. instance_method(:a).bind(mandiri).panggilan
, yang akan bekerja, tapi jelek.
Anda bahkan bisa menentukan sendiri metode dalam Objek untuk bertindak seperti super di jawa:
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
Jika anda don't secara eksplisit perlu memanggil#a dari B#b, melainkan perlu memanggil#a dari B#a, yang secara efektif apa yang anda're lakukan dengan cara B#b (kecuali anda're contoh isn't cukup lengkap untuk menunjukkan mengapa anda're menelepon dari B#b, anda hanya dapat memanggil super dari dalam B#a, hanya seperti ini kadang-kadang dilakukan di menginisialisasi metode. Saya tahu ini adalah jenis yang jelas, saya hanya ingin mengklarifikasi untuk setiap Ruby pendatang baru yang anda don't harus alias (khusus hal ini kadang-kadang disebut "sekitar alias") dalam setiap kasus.
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