2016-04-13 9 views
0

別のクラスを含むクラスがあります。私は懸念を持って第二のクラスを変更する可能性を持っていたい。ここで内部クラスを気にしてオーバーライドする方法は?

コードされています

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表示yolorewriteBaseClass::InnerClass.new.sample表示samplerewriteを作るための方法はあります

+0

「*これはうまく動作します」と「*これは動作しません」ブロックには同じコードがあります! – Uzbekjon

+0

今、彼らはしません! :) – Uzbekjon

+0

ええ、私はポストの後に気づきます。申し訳ありません:D – Naremy

答えて

2

あなたは完全例えば、このような定数を置き換えることができます。

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 
end 
関連する問題