5
说,我有一个类A
和一个模块B
。我想将B
包含/扩展为A
,但将包含/扩展方法标记为私有(所以它们将不会被A
的调用者访问,但可在A
的方法内访问)。我可以包含/扩展模块,但将所有包含/扩展方法标记为私有?
如何将B
纳入A
但将所有包含的方法标记为私有?
说,我有一个类A
和一个模块B
。我想将B
包含/扩展为A
,但将包含/扩展方法标记为私有(所以它们将不会被A
的调用者访问,但可在A
的方法内访问)。我可以包含/扩展模块,但将所有包含/扩展方法标记为私有?
如何将B
纳入A
但将所有包含的方法标记为私有?
包括然后明确地使所有包含的方法是私有的?
class A
include B
private *B.instance_methods
extend B
class << self
private *B.instance_methods
end
end
可以猴补丁Module
添加private_include
和private_extend
:
class Module
def private_include *modules
class_eval do
self.send(:include, *modules)
modules.each do |mod|
self.send(:private, *mod.instance_methods)
end
end
end
def private_extend *modules
singleton = class << self; self end
singleton.instance_eval do
self.send(:include, *modules)
modules.each do |mod|
self.send(:private, *mod.instance_methods)
end
end
end
end
这是一个非常好的monkeypatch来回答这个问题。布拉沃。 – ghayes 2013-07-14 21:23:06
也许这是一份工作更适合代表团/组成,而不是继承? – 2013-03-26 18:17:47
@RonDahlgren您能否详细说明或提供或链接到您的建议? – 2013-03-26 18:21:38
委托是涉及保存B(委托)的内部实例的设计模式。您想要公开的方法应该被写为A的方法,其中实现只是调用(“委托”)到B的内部实例。组合是一种不太具体的委托形式,其中特定的行为是通过“合成'不同班级的实例。维基百科:http://en.wikipedia.org/wiki/Delegation_pattern和http://en.wikipedia.org/wiki/Object_composition – 2013-03-26 18:41:20