memanggil metode lain di super class di ruby

kelas A
def yang
menempatkan 'di #a'
end
end

kelas B < A def yang b() end def b

di sini saya ingin memanggil#a.

end end

Larutan
class B < A

  alias :super_a :a

  def a
    b()
  end
  def b
    super_a()
  end
end  
Komentar (6)

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
Komentar (2)

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
Komentar (0)