2010-10-03 3 views
9

Wenn Klassen die Singleton-Klassen werden auch geerbt in Ruby vererbt werden:Warum schließt die Einfügung von Ruby-Modulen die Singleton-Klasse des Moduls aus?

class A 
    def self.hello 
    puts "hello" 
    end 
end 

class B < A 
end 

B.hello #=> "hello" 

Doch mit Modulen, ist dies nicht der Fall:

module M 
    def self.goodbye 
    puts "goodbye" 
    end 
end 

class A 
    include M 
end 

A.goodbye #=> NameError 

auf diesen hässlichen viele ppl zurückgreifen, um diese Einschränkung zu erhalten Hack:

module M 
    def self.included(c) 
    c.extend ClassMethods 
    end 

    module ClassMethods 
    def goodbye 
     puts "goodbye" 
    end 
    end 
end 

Ok, so meine Frage: gibt es einen theoretischen/konzeptionellen Grund für diese Beschränkung auf Module? oder war es nur eine Umsetzungsschwierigkeit?

Nach dem Blick auf den C-Quellcode (YARV/MRI) kann ich identifizieren, gibt es eine Implementierung Schwierigkeit (nicht unüberwindbar, aber eine egal), aber ist das der einzige Grund? Gibt es andere Gründe für diese Einschränkung?

danke

+0

Warum sollten sie auch? Das Einbinden eines Moduls ist nicht das Gleiche wie das Erben einer Klasse. –

+0

@Mladen, ich kaufe das nicht. Wenn die begriffliche Unterscheidung so klar war, warum versuchen dann Leute (selbst sehr Top-Ruby-Programmierer), diese Einschränkung zu umgehen, indem sie den 'ClassMethods'-Hack benutzen? Weiter - warum ist es so unbedacht, dass irgendwie die Natur des Moduls diese besondere Einschränkung mit sich bringt? – horseyguy

+0

IMHO, Modul Mixins! = Mehrfachvererbung, also was auch immer einige Leute tun könnten, beweist wirklich nichts. BTW, können Sie die Notwendigkeit für den Hack durch ein reales Beispiel illustrieren, wo man zum Beispiel nicht dasselbe erreichen könnte, indem man das Modul 'A' und das Modul' B' mit einbezieht? –

Antwort

0

Warnung: das folgende ist nur Spekulation.

Wenn Sie eine Klasse verwenden, benötigen Sie Singleton-Klassenmethoden, weil Sie darauf angewiesen sind, das Objekt zu erstellen (z. B. MyClass.new). Wenn Sie ein Modul verwenden, brauchen Sie sie nicht, da Sie keine Objekte rein von einem Modul erstellen können.

+0

Singleton-Methoden können für viel mehr als das Erstellen von Objekten verwendet werden; Ich denke nicht, dass dies der Grund sein kann, aber danke :) – horseyguy

1

Wenn niemand mit einem zwingenden Argument kommen kann, denke ich, dass die Beschränkung nur auf Schwierigkeiten bei der Implementierung zurückzuführen ist. Nichtsdestotrotz habe ich in den letzten Tagen an dem Problem gearbeitet und habe (in der Betaversion) eine neue Version des Includes include_complete, die diese Schwierigkeiten umgeht und die Modulvererbung so wie Klassenvererbung (bringt den Singleton)

ermöglicht

Überprüfen sie das Projekt hier aus: http://github.com/banister/include_complete

Und passen sie das Projekt noch in der Betaphase sehr viel, aber es scheint immer noch wie gewünscht zu arbeiten, so weit

Verwandte Themen