Ruby ottenere ereditare la classe di

Sto lavorando per creare il mio primo plugin per rails. Io sono ancora abbastanza nuovo per ruby e mi chiedevo se è possibile ottenere il ereditando la classe?

Per esempio, sto cercando di creare un plugin che permettono di test di unità e test funzionali quando non si utilizza migrazioni. Quello che sto cercando di fare è di inizializzare una variabile di classe nominato controllore per essere inizializzato il tipo di controller che è in fase di test.

Se ho una classe base ControllerTest:

class ControllerTest < Test::Unit::TestCase
  attr_accessor :controller

  def initialize
    super
    @controller = "call function that will find the inheriting classes name and create an instance of that controller type."
  end
end

Quindi quello che sto attualmente bloccato su è sempre il nome di ereditare la classe. È possibile questo? E se no, qualcuno sa un altro modo su come potrei fare per realizzare questo?

Grazie in anticipo.

OriginaleL’autore Brian DiCasa | 2010-04-11

4 Replies
  1. 9

    Se si desidera ottenere il nome della classe che si sta, in questo momento, è possibile utilizzare self.class.name. Se si desidera ottenere le superclassi, è possibile utilizzare la matrice self.class.ancestors, ad esempio,self.class.ancestors[1].name. Immediate superclasse è disponibile anche come self.superclass.

    Modifica, aggiunta di un esempio:

    class ControllerTest
      attr_accessor :controller
      def initialize
        super
        @controller = eval "#{self.class.name}Controller.new(self)"
      end
    end
    
    class Foo <ControllerTest
    end
    class Bar <ControllerTest
    end
    
    class Controller
      def initialize (o)
        puts "Created #{self.class} to control #{o.class.name}"
      end
    end
    
    class FooController <Controller
    end
    class BarController <Controller
    end
    
    foo = Foo.new
    bar = Bar.new

    Questo uscite

    Created FooController to control Foo
    Created BarController to control Bar
    Per riferimento futuro, il modo più semplice è quello di utilizzare solo il “ereditato” richiamata.
    Se è così, post esempio per realizzare il stessa cosa (= ottenere un tipo specifico di controller basato sul nome di ereditare la classe) che utilizza; che sarebbe effettivamente utile per chi si trova questa domanda più tardi e in realtà significa chiedere come utilizzare la inherited richiamata invece che a questa domanda.
    Sarebbe bello avere una spiegazione per il downvote; certamente c’è disaccordo sull’interpretazione della domanda, ma il codice in questa risposta, funziona e risponde alla domanda come previsto dal richiedente. Non è colpa di risposta, se non rispondere a qualche altra domanda.

    OriginaleL’autore Arkku

  2. 9

    Molto semplice: utilizzare il “ereditato” richiamata.

    Dal RDoc per Classe classe:
    ereditato(sottoclasse): Richiamata ogni volta che una sottoclasse della classe corrente viene creato.

    Esempio:

       class Foo
          def self.inherited(subclass)
             puts "New subclass: #{subclass}"
          end
       end
    
       class Bar < Foo
       end
    
       class Baz < Bar
       end
    produces:
    
       New subclass: Bar
       New subclass: Baz

    http://ruby-doc.org/core/classes/Class.html#M002785

    Come l’OP accettato la mia risposta, sembra che il tuo downvote per “non aver risposto alla domanda” potrebbe essere stato un po ‘ scorretto.
    lol, il tuo è ancora la scelta più limitata. L’OP solo apparentemente non so come selezionare una risposta. 🙂
    L’OP selezionato l’unica risposta che si inserisce nell’esempio di codice viene inviato nella sua domanda. Il modo in cui tu (e qualsiasi numero di altri manifesti) interpretare l’ (certamente ambiguo) formulazione al fine di non modificare l’OP significato a chiedere. Così, anche se la tua risposta è perfettamente valida per la domanda è pensiero, ha chiesto, significa solo che la questione non può essere stato molto chiaro a tutti, ma si è tradotto in una risposta accettabile.
    (Naturalmente, si può sostenere per un disegno diverso del po codice e modificare la tua risposta per illustrare il funzionamento di questa soluzione potrebbe sostituirlo, ma per ora non si traduca in un “@controller per essere inizializzato il tipo di controller che è in fase di test”. Mostrando come sarebbe più costruttivo che downvoting la domanda e ogni interpretazione diversa…)
    Io non sono d’accordo. La vostra è ancora la scelta poveri tenuto conto della formulazione del titolo del post e la domanda stessa (compreso il codice di esempio).

    OriginaleL’autore fig

  3. 0

    Credo che avrete bisogno di prendere le classi vengono definite…

    Dal RDoc per Classe classe:

    inherited(subclass)
    Callback invoked whenever a subclass of the current class is created.
    
    Example:
    
       class Foo
          def self.inherited(subclass)
             puts "New subclass: #{subclass}"
          end
       end
    
       class Bar < Foo
       end
    
       class Baz < Bar
       end
    produces:
    
       New subclass: Bar
       New subclass: Baz
    Duplicato la stessa risposta pubblicato in precedenza.
    Quando ho iniziato a postare questa tua risposta non c’era. Scusate se siete stati offesi, ma non ho visto la tua risposta fino a quando ho postato il mio.

    OriginaleL’autore Mike Cargal

  4. 0

    Questo elenco solo i metodi di istanza corrente della classe

    auto.classe.nuovo.metodi di sé.classe.antenati[1].nuovo.metodi

    E soluzione generica
    c = some_class

    c.nuovo.metodi – c.antenati[1].nuovo.metodi

    OriginaleL’autore dux

Lascia un commento