Вызов дочернего метода из parent, когда родительский метод вызывается из child - PullRequest
0 голосов
/ 10 января 2019

Есть 2 класса Ruby:

class Parent
  class << self
    def method1
      ...
    end

    def method2
      ...
      method1
      ...
    end
  end
end

class Child < Parent
  class << self
    def method1
      ...
    end

    def method2
      ...
      super
    end
  end
end

Класс Child наследуется от Parent и переопределяет его методы method1 и method2. Method2 класса Parent вызывается из того же метода в Child (используется ключевое слово super). Я хочу, чтобы при вызове из Child (то есть Child.method2) он использовал method1 из Child. Вместо этого он использует method1 из Parent. Это понятно, но не желательно.

Как это исправить?

1 Ответ

0 голосов
/ 10 января 2019

Итак, я запустил ваш код с некоторыми путами:

class Parent
  class << self
    def method1
        puts "parent.method1; self: #{self.inspect}"
    end

    def method2
        puts "parent.method2 before method1 call; self: #{self.inspect}"
        method1
        puts "parent.method2 after method1 call"
    end
  end
end

class Child < Parent
  class << self
    def method1
        puts "child.method1; self: #{self.inspect}"
    end

    def method2
        puts "child.method2 before super; self: #{self.inspect}"
        super
        puts "child.method2 after super"
    end
  end
end


Child.method2

и вот что я получил:

выход

child.method2 before super; self: Child
parent.method2 before method1 call; self: Child
child.method1; self: Child
parent.method2 after method1 call
child.method2 after super

Разве это не то, что вы хотели?

Ruby обрабатывает разрешение метода, причем целью всегда является класс объекта. В приведенном выше коде, даже когда вызывается с super, класс все еще дочерний. Поэтому он будет вызывать любой метод, определенный для child, а затем для parent, если он не найден или если child вызывает super ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...