我有一个包含另一个类的类。我想有一个可能性,改变二等的关切。
以下是代码:
class BaseClass
class InnerClass
def sample; puts 'sample'; end
def self.yolo; puts 'yolo'; end
end
end
BaseClass::InnerClass.yolo # yolo
BaseClass::InnerClass.new.sample # sample
module UglyButNeededPatch
extend ActiveSupport::Concern
included do
class NewInnerClass
def sample; puts 'new sample'; end
def self.yolo; puts 'new yolo'; end
end
class InnerClass
def sample; super(); puts 'rewrite'; end
def self.yolo; super(); puts 'rewrite'; end
end
end
end
BaseClass.__send__(:include, UglyButNeededPatch)这工作得很好
BaseClass::NewInnerClass.yolo # new yolo
BaseClass::NewInnerClass.new.sample # new sample这不管用
BaseClass::InnerClass.yolo # still display yolo
BaseClass::InnerClass.new.sample # still display sample有没有办法使BaseClass::InnerClass.yolo显示yolorewrite和BaseClass::InnerClass.new.sample显示samplerewrite
发布于 2016-04-13 10:32:38
您可以像这样完全替换常量,例如:
module UglyButNeededPatch
extend ActiveSupport::Concern
included do |base|
base::InnerClass = Class.new do
def sample; puts 'rewrite'; end
def self.yolo; puts 'rewrite'; end
end
end
end如果您想通过手术修补内部类,我发现的最简单的方法是使用另一个注意事项:
module UglyButNeededPatch
extend ActiveSupport::Concern
included do |base|
base::InnerClass.include(InnerClassPatch)
end
module InnerClassPatch
extend ActiveSupport::Concern
def sample; puts 'rewrite'; end
module ClassMethods
def yolo; puts 'rewrite'; end
end
end
endhttps://stackoverflow.com/questions/36595138
复制相似问题