0

给定以下课程

class Parent
  def hello
    puts "I am the parent class"
  end

  def call_parent_hello
    hello
  end
end

class Child < Parent
  def hello
    puts "I am the child class"
  end
end

当我执行以下操作时:

c = Child.new
c.hello             # => Outputs: "I am the child class"
c.call_parent_hello # => Outputs: "I am the child class"

是否可以Child#call_parent_hello访问Parent#hello但不改变Parent类?

我正在寻找这样的某种called_by_parent_class?实现:

def hello
  if called_by_parent_class?
    super
  else
    puts "I am the child class"
  end
end
4

4 回答 4

1

我认为你正在寻找做这样的事情:

class Parent
  def hello( opts = '' )
    "Who's talking? The #{self.class} class is via the Parent class!"
  end
end

class Child < Parent

  def hello( opts = '' )
    if opts == 'super'
      super 
    else
      "I have a parent and an independent voice"
    end
  end

  def call_mom
    hello( 'super' )
  end

end

c1 = Child.new

puts c1.hello     => "I have a parent and an independent voice"
puts c1.call_mom  => "Who's talking? The Child class is via the Parent class!"

但是(我不是在这里拖钓)我也认为你有点错过了子类化的意义。通常,您将子类化以获得这种方法的自动范围。如果你打破这一点,我想你会想要实例化一个 Parent 的实例。但每一个他自己。

祝你好运!

于 2012-07-07T18:16:49.790 回答
1

您可以使用以下super关键字:

class Child < Parent
  def hello
    super
  end
end
于 2012-07-07T17:26:44.397 回答
1

重读你的问题后,我看到你真正的问题是:

是否可以让 Child#call_parent_hello 访问 Parent#hello,但不改变 Parent 类?

将您的孩子班级更改为:

class Child < Parent
  alias_method :call_parent_hello, :hello

  def hello
    puts "I am the child class"
  end
end

正如你所问的那样解决问题

于 2014-12-17T19:25:43.460 回答
0
  1. 使用super. super在父类中调用相同的方法

    class Child < Parent
      def call_parent_hello
        super
      end
    end
    
  2. 使用直接层次结构调用。Class#ancestors 为您提供继承的层次结构。

    class Child < Parent
      def call_parent_hello
        self.class.ancestors[1].new.hello
      end
    end
    
于 2012-07-07T17:30:54.013 回答