在 Ruby 中调用受保护的超类类方法

发布于 2024-10-06 01:46:43 字数 240 浏览 9 评论 0原文

我想从基类中的实例方法调用受保护的超类类方法。

class A
  class << self
    protected
    def foo
      puts "In foo"
    end
  end
end

class B < A
  def bar
    puts "In bar"
    # call A::foo
  end
end

最好的方法是什么?

I want to call a protected superclass class method from an instance method in the base class.

class A
  class << self
    protected
    def foo
      puts "In foo"
    end
  end
end

class B < A
  def bar
    puts "In bar"
    # call A::foo
  end
end

What's the best way to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

岁月静好 2024-10-13 01:46:43

... 2.67 年后 ...

解决这个问题的更简单方法是使用 class_eval

class A
  class << self
    protected
    def foo
      puts "In foo"
    end
  end
end

class B < A
  def bar
    self.class.class_eval { foo }
  end
end

B.new.bar    # prints "In foo"

... 2.67 years later ...

A simpler way to solve this is with class_eval

class A
  class << self
    protected
    def foo
      puts "In foo"
    end
  end
end

class B < A
  def bar
    self.class.class_eval { foo }
  end
end

B.new.bar    # prints "In foo"
尹雨沫 2024-10-13 01:46:43

重写B中的方法,调用super:

class A
  class << self
    protected
    def foo
      puts "In foo"
    end
  end
end

class B < A

  def self.foo
    super
  end

  def bar
    puts "In bar"
    # call A::foo
    self.class.foo        
  end
end

>> B.foo
=> In foo
>> B.new.bar
=> In bar
=> In foo

Override the method in B, calling super:

class A
  class << self
    protected
    def foo
      puts "In foo"
    end
  end
end

class B < A

  def self.foo
    super
  end

  def bar
    puts "In bar"
    # call A::foo
    self.class.foo        
  end
end

>> B.foo
=> In foo
>> B.new.bar
=> In bar
=> In foo
贪恋 2024-10-13 01:46:43

到目前为止,我找到的唯一解决方案是在子类中定义一个类方法,该方法调用超类中的类方法。然后我可以在子类的实例方法中调用这个方法。

class A
  class << self
    protected
    def foo
      puts "In foo"
    end
  end
end

class B < A
  def self.call_foo
    puts "In call_foo"
    A::foo
  end

  def bar
    puts "In bar"
    self.class.call_foo
  end
end

这真的有必要吗?

So far, the only solution I've found is to define a class method in the subclass that calls the class method in the superclass. Then I can call this method in the subclass' instance method.

class A
  class << self
    protected
    def foo
      puts "In foo"
    end
  end
end

class B < A
  def self.call_foo
    puts "In call_foo"
    A::foo
  end

  def bar
    puts "In bar"
    self.class.call_foo
  end
end

Is this really necessary?

半山落雨半山空 2024-10-13 01:46:43

我可能会把 A.foo 公开。否则 send 会执行此操作,因为它绕过访问控制:

A.send(:foo)

I'd probably just make A.foo public. Otherwise send will do it, since it bypasses access controls:

A.send(:foo)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文