定义仅在某个模块/类中可见的方法
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 !!!
【讨论】:
以上是关于定义仅在某个模块/类中可见的方法的主要内容,如果未能解决你的问题,请参考以下文章