Mehrfach-Vererbung, Typ-Klasse Vererbung in ruby
Bekam ich einen Base
Superklasse und eine Reihe von abgeleiteten Klassen, wie Base::Number
, Base::Color
. Ich möchte in der Lage sein, um diese Kind-Klassen, als wenn ich Sie geerbt von sagen Fixnum
im Fall von Number
.
Was ist der beste Weg, dies zu tun, während immer noch mit Ihnen angemessen zu reagieren, um is_a? Base
?
So, ich sollte in der Lage sein zu tun
Number.new(5) + Number.new(6) # => 11
Number.new.is_a? Base # => true
Ich denke, ich könnte mix-in-Basis, und überschreiben Sie die is_a?, kind_of? und instance_of? Methoden, aber hoffentlich gibt es eine sauberere Möglichkeit.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eigentlich ganz einfach mit Ruby:
true
für Mixins in Verbindung, und es funktioniert sogar, wenn das mitgelieferte Modul umfasst ein Modul! Ich werde wahrscheinlich verwenden Sie diese dann, statt forwardable. danke!world = Stringy.new("World")
Warum Sie darauf bestehen, mit is_a?/kind_of? wenn respond_to? ist eine wesentlich bessere Möglichkeit, zu überprüfen, Dinge? Sie wollen Objekte, die eine Schnittstelle implementieren/Vertrag nicht zu einer Unterklasse von einem beliebigen Superklasse. Aber vielleicht fehlt mir irgendeine Art von Anforderung hier.
Bearbeiten: ich verstehe deine Argumentation, aber es führt oft zu schlechten OO/dynamisches design. Entweder Sie tun etwas wie dieses, die vielleicht eine akzeptable Idee in leaf-Klassen, aber in einem framework gelöst werden sollte, die mit der Nachfolge:
oder so etwas wie dieses:
Ich denke, dass es code-Fehler mit nicht verstehen Ausnahme in message-passing-basierte Sprache ist eine perfekte design-Entscheidung.
Als ein zusätzliches problem, mit is_a? statt respond_to? Grenzen Sie Ihre Fähigkeit zu verwenden, mock-up-Objekte, die während der unit-Tests. Das kann durchaus ein großes Problem auch für die mäßig komplizierten code.
Ich glaube, Sie sind mit der Vererbung falsch, wenn Sie völlig unabhängig von Kategorien wie "Anzahl" und "Farbe" alle Ergebnisse der gleichen Basisklasse. Würde ich Komponieren, wenn Sie tun müssen, Zugriff auf die gleichen Routinen (nicht sicher, warum Sie würde, obwohl).
Ruby-äquivalent zu multiplen Vererbung Mixins in Verbindung. Es klingt für mich wie das, was Sie wollen, ist die Basis für ein Modul wird gemischt in mehrere Klassen.