2016-04-13 16 views
0

Ich habe eine Klasse, die eine andere Klasse enthält. Ich möchte die Möglichkeit haben, die zweite Klasse mit einem Anliegen zu wechseln. HierWie man eine innere Klasse mit einer Sorge überschreibt?

ist der Code:

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) 

Diese Arbeit fein

BaseClass::NewInnerClass.yolo  # new yolo 
BaseClass::NewInnerClass.new.sample # new sample 

Das funktioniert nicht

BaseClass::InnerClass.yolo  # still display yolo 
BaseClass::InnerClass.new.sample # still display sample 

Gibt es eine Möglichkeit BaseClass::InnerClass.yolo Anzeige yolorewrite und BaseClass::InnerClass.new.sample Anzeige zu machen samplerewrite

+0

"* Das funktioniert gut *" und "* Das funktioniert nicht *" Blöcke haben den gleichen Code! – Uzbekjon

+0

Jetzt nicht! :) – Uzbekjon

+0

Ja, ich merke nach dem Post. Entschuldigung dafür: D – Naremy

Antwort

2

Sie vollständig die Konstante wie dies zum Beispiel ersetzen:

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 

Und wenn Sie chirurgisch wollen die innere Klasse Patch, der einfachste Weg, ich fand, ist ein weiteres Anliegen zu nutzen:

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 
Verwandte Themen