Alternativen zu abstrakte Klassen in Ruby?
Ich bin neu in Ruby. Ein einfaches Beispiel, was ich brauche:
class Animal
abstract eat()
class Cat < Animal
eat():
implementation
class Dog < Animal
eat():
implementation
In anderen Worten, das Essen () - Methode sollte erforderlich sein für alle Klassen, die zu verlängern Tier.
In JAVA würde ich nur verwenden eine abstrakte Klasse, aber nach einigen Forschung, fand ich, dass viele Menschen nicht nutzen es in Ruby und Mixins /Module empfohlen anstelle.
Allerdings verstehe ich nicht, wenn die Module können mehr als nur eine Ergänzung Methoden. Um genau zu sein, können Module festgelegt, die Anforderungen für die Klassen, die Methoden, die Sie implementieren müssen (wenn ja, ein Beispiel wäre sehr hilfreich)?
Zusammenfassend, was soll ich in diesem Fall verwenden, wenn ich will sicher sein, dass alle Klassen den gleichen Typ haben, insbesondere Methoden und implementieren Sie in Ihren eigenen Weg?
- Was ist das Zitat über die
NotImplementedError
und das Fahrwerk von Flugzeugen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ruby nicht bieten diese Funktionalität nicht. Sie sind dafür verantwortlich, dass Ihre Klassen implementieren, was Sie sollten zu implementieren.
Teil der Grund, dass so eine Funktionalität unmöglich ist, für Ruby, das Ruby-Klassen kann wieder geöffnet werden, und Ruby unterstützt das laden von beliebigen code zur Laufzeit, so können wir nicht wissen, ob eine Klasse implementiert eine bestimmte Schnittstelle, bis wir versuchen, es zu nennen.
Angenommen, dass eine
Animal
muss eineeat
Methode, und ich Tue das folgende:Durch das Ende der Datei, die
Cat
wird seineeat
definition, denn Ruby-Klassen können wieder geöffnet und veränderte sich mehrfach. Sollte der code Fehler nach der ersten definition, daeat
war nicht definiert noch? Die Umsetzung würde mehr Schaden als helfen würde, da die Wiedereröffnung Klassen üblich ist, auch wenn dieses Beispiel ist konstruiert. Sollte es Fehler aus, sobald daseat
- Methode aufgerufen, die nicht existiert, so können wir sicher sein, dass es einmal definiert, brauchen wir es? Naja, wenn die Methode fehlten, dass würde geschehen, sowieso. Der Dolmetscher kann nie wissen, ob eine class-definition ist auf dem Weg, so kann es nie geschnitten Sie ab, bis die Methode tatsächlich aufgerufen wird.Kurz gesagt, Super einfach vielleicht nicht benötigen eine Methode definiert werden, die in Ruby, da die dynamische Natur der Klassen widersprechen diesem Ziel.
Sorry! Dies ist ein Ort, wo unit-Tests in handliches kommen könnte, obwohl, um sicherzustellen, dass Ihre Unterklassen zu tun, was Sie tun soll, sowieso.
Verwenden Sie ein Modul, das definiert die Methoden, die implementiert werden müssen.
Yo kann nur mit leeren Methoden, oder machen Sie zu Fehler zu zwingen Unterklassen zu implementieren.
Der Seite nach unten ist, wird dies nur geltend machen, wenn die Methode tatsächlich aufgerufen wird. Ruby ist eine dynamische Sprache ist und es keine compile-Zeit-Prüfung.
Gibt es kein äquivalent zu abstrakte Klassen in Ruby. Meist ist dies, weil Ruby ist dynamisch typisiert, was bedeutet, dass das Konzept der abstrakten Klassen nicht wirklich gelten.
Wenn Sie wirklich wollen, zu implementieren Abstraktion verwenden Sie dann die Abstraktion gem.
Referenzierung Beispiel von Abstraktion Juwel WIKI.