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#helloParent

私はこのようなある種の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

super次のキーワードを使用できます。

class Child < Parent
  def hello
    super
  end
end
于 2012-07-07T17:26:44.397 に答える
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

あなたの質問を読み直した後、あなたの本当の質問は次のとおりです。

親クラスを変更せずに、Child#call_parent_hello を Parent#hello にアクセスさせることは可能ですか?

子クラスを次のように変更します。

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 に答える