首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用关注点覆盖内部类?

如何用关注点覆盖内部类?
EN

Stack Overflow用户
提问于 2016-04-13 10:07:11
回答 1查看 383关注 0票数 0

我有一个包含另一个类的类。我想有一个可能性,改变二等的关切。

以下是代码:

代码语言:javascript
复制
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)

这工作得很好

代码语言:javascript
复制
BaseClass::NewInnerClass.yolo       # new yolo
BaseClass::NewInnerClass.new.sample # new sample

这不管用

代码语言:javascript
复制
BaseClass::InnerClass.yolo       # still display yolo
BaseClass::InnerClass.new.sample # still display sample

有没有办法使BaseClass::InnerClass.yolo显示yolorewriteBaseClass::InnerClass.new.sample显示samplerewrite

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-13 10:32:38

您可以像这样完全替换常量,例如:

代码语言:javascript
复制
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

如果您想通过手术修补内部类,我发现的最简单的方法是使用另一个注意事项:

代码语言:javascript
复制
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
end
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36595138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档