有没有办法在模块/类foo
上定义方法A
,以便它只能从模块/类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
我直觉地认为精致是精神上的接近,但它似乎没有做我想要的。
答案 0 :(得分:-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类名在所有子类中使用A.new.foo,那么你应该使用以下内容。
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 !!!