定义仅在某个模块/类中可见的方法

Posted

技术标签:

【中文标题】定义仅在某个模块/类中可见的方法【英文标题】:Defining a method visible only within a certain module/class 【发布时间】:2014-06-06 13:08:22 【问题描述】:

有没有办法在模块/类A 上定义一个方法foo,以便它只能在模块/类B 或其后代中可见?下面说明了这种情况:

A.new.foo # => undefined

class B
  A.new.foo # => defined
  def bar
    A.new.foo # => defined
  end
  def self.baz
    A.new.foo # => defined
  end
end

class C < B
  A.new.foo # => defined
  def bar
    A.new.foo # => defined
  end
  def self.baz
    A.new.foo # => defined
  end
end

我直觉上觉得精致在精神上很接近,但它似乎并没有达到我想要的效果。

【问题讨论】:

细化有什么问题?据我了解,您应该能够在 B 中使用 A 改进并完全实现您所描述的。 通过细化,您必须每次在B 的类主体中写入using ...。这是不切实际的。 【参考方案1】:

这行得通。 ^_^

class A
    private
    def foo
        "THE FOO !!!"
    end
end

class B < A
    public :foo

    def initialize
        @foo = self.foo
    end
end

puts "A.new.foo # A.new.foo rescue '... sorry, no.' "
=> A.new.foo ... sorry, no.

puts "B.new.foo # B.new.foo rescue '... sorry, no.' "
=> B.new.foo THE FOO !!!

如果您想在所有子类中使用 A.new.foo 仍然使用 A 类名,那么您应该使用以下内容。

class A
    private
    def foo
        "THE FOO !!!"
    end
end

class B
    class A < A
        public :foo
    end

    attr_reader :c, :d

    def c
        A.new.foo
    end

    def d
        A.new.foo
    end
end

puts "A.new.foo # A.new.foo rescue '... sorry, no.' "
=> A.new.foo ... sorry, no.

puts B.new.c
=> THE FOO !!!

puts B.new.d
=> THE FOO !!!

【讨论】:

以上是关于定义仅在某个模块/类中可见的方法的主要内容,如果未能解决你的问题,请参考以下文章

如何检查定义的方法?来自在类中使用的模块,其中包含模块后定义的方法

为啥模块的单例方法在混合的下游特征类中不可见?

如何覆盖模块中的类常量和方法?

如何为仅在测试中可见的结构创建 init 方法?

切点表达式定义了拦截类中所有方法,所以每个方法都被增强

成员变量跟局部变量