1

我有以下 Ruby 代码:

class B
  class << self
    protected
    def prot
      puts "victory"
    end
  end
end
class C < B
  def self.met
    C.prot
  end
end

C.met

它试图证明受保护的类方法在 Ruby 中是继承的。问题是,如果我将met方法转换为这样的实例方法:

class B
  class << self
    protected
    def prot
      puts "victory"
    end
  end
end
class C < B
  def met
    C.prot
  end
end

c = C.new
c.met

它行不通。也许它与类和实例方法范围有关?

4

3 回答 3

1

它不起作用,因为Cis not的实例kind_of?(B.singleton_class)

在 ruby​​ 中,可以在对象的上下文中调用受保护的方法,该对象是kind_of?定义该方法的类,具有显式接收器,该接收器也是kind_of?定义该方法的类。

您在 的单例类上定义了一个受保护的方法B,因此该方法只能在 的对象中调用kind_of?(B.singleton_class)。类C继承B,所以C的单例类继承了B单例类,所以Ckind_of? B.singleton_class。因此,在您的第一种情况下,它可以工作。但显然,C.newis not kind_of? B.singleton_class,所以它不会工作。

于 2015-08-04T01:31:18.507 回答
0

对于受保护的方法,我们可以从属于同一类的任何对象的范围内调用它们。在您的代码片段中,根据类的范围,方法查找链会在该方法继承到超类时拾取该方法。这意味着,您在其 Singleton 类中定义了一个方法,这意味着我们可以使用该类的对象来调用它。所以我们可以通过 A 和 B 的对象来调用它,因为 B 对象继承自 A。

总之,您可以在类的公共方法中调用受保护的方法。请参考以下网址以获得更好的理解

http://nithinbekal.com/posts/ruby-protected-methods/

在 Ruby 中访问受保护的方法

于 2015-08-04T01:32:18.470 回答
0

我认为这与将.protegido方法声明为元类(或单例类)的一部分而不是 B 类本身的一部分的区别有关。

在此处阅读:Ruby 中的元编程:一切都与自我有关

于 2015-08-04T02:18:41.173 回答