2010-12-17 6 views
1

Unterstützt Ruby "Einschlusspolymorphismus"? Ist das dasselbe wie Duck Typing?Unterstützt Ruby Einschlusspolymorphismus

Wenn nicht, was ist der Unterschied zwischen Polymorphie und Duck-Typisierung in Ruby?

Kann jemand bitte unten mit meinem Beispiel illustrieren:

# superclass - inheritance 
class Animal 
    def make_noise 
    # define abstarct method (force override) 
    raise NoMethodError, "default make_noise method called" 
    end 
end 

# module - composition 
module Fur 
    def keep_warm 
    # etc 
    end 
end 

# subclass = is-a relationship 
class Bird < Animal 
    # override method - polymorphism 
    def make_noise 
    "Kaaw" 
    end 
end 

class Cat < Animal 
    # module mixin = has-a relationship 
    include Fur 

    def make_noise 
    "Meow" 
    end 
end 

class Radio 
    # duck typing (no inheritance involved) 
    def make_noise 
    "This is the news" 
    end 
end 

class Coat 
    include Fur 
end 

animals = [Bird,Cat,Radio,Coat,Animal] 

animals.each do |a| 
    # polymorphism or duck typing? 
    obj = a.new 
    if obj.respond_to? 'make_noise' 
    puts obj.make_noise 
    end 
end 
+0

Mein Beispiel macht Annahmen, die ich bestätigen möchte. Zum Beispiel ist Polymorphismus darauf beschränkt, wo Vererbung verwendet wird. Duck Typing veranschaulicht Mixins. Ich habe Probleme, dies aufzuklären, es scheint widersprüchliche Informationen aus Büchern/Wikipedia usw. zu geben. – Question

Antwort

0

Gut in Ihrem Beispiel, könnte man sagen, dass jede Schleife durch Duck Typing arbeitet (mit der Tatsache, dass der Client-Code kümmert sich nur, wenn die Variable kann Lärm machen), aber die Tatsache, dass Katzen und Vögel Lärm machen können, ist eine theoretische Beschreibung des Unterklassenmechanismus, der als Polymorphismus bekannt ist. So könnte man sagen, dass ein Unterschied zwischen Polymorphismus und Duck Typisierung darin besteht, dass Polymorphie die Idee ist, dass man ein Objekt, das behauptet, ein bestimmter Typ anstelle eines anderen zu sein, aber Enten-Typisierung ist die Idee Sie kümmern sich nicht um den Typ des Objekts, solange es eine bestimmte Schnittstelle implementiert. Wenn Sie beispielsweise in Java eine Unterklasse von Animal erstellen, können Sie erwarten, dass sie nicht nur Geräusche erzeugt, sondern auch andere Verhaltensweisen mit Tieren verknüpft, während im Fall von Ruby ein Objekt Geräusche verursachen kann hängt nicht vom Typ ab, nur von der Existenz einer bestimmten Methode. Natürlich haben Sie in Java das Konzept der Schnittstellen, die einen (statischen) Mechanismus für das gleiche Muster geben.

Der wichtigste Unterschied IMHO ist unterschiedliche Programmierung Philosophien hinter den Namen, nicht so sehr in den Konzepten selbst.

Ich denke, es kommt darauf an, dass der Begriff Polymorphismus mit strukturierteren OOP-Ideen verbunden ist, während Ruby einen Namen für eine Art der Programmierung erfinden musste, die verschiedene Möglichkeiten und Implikationen hat.

+0

Danke für Ihre schnelle Antwort. Sie sagen also, dass Polymorphismus darauf beschränkt ist, wo Vererbung beteiligt ist? Bedeutet dies, dass die Enten-Typisierung mit der Polymorphie identisch ist, wenn die Vererbung involviert ist? – Question

+0

Ich glaube nicht, dass die Definition von Polymorphismus von Vererbung abhängt, ich denke auch nicht, dass es per se recht universell ist, dies ist auf dem Wikipedia-Eintrag: In stark typisierten Sprachen bedeutet Polymorphismus normalerweise, dass Typ A irgendwie vom Typ B abgeleitet ist, oder Typ C implementiert eine Schnittstelle, die Typ B darstellt. In schwach typisierten Sprachen sind Typen implizit polymorph. –

+0

Ich habe eine Definition unter dem folgenden Link gefunden, die besagt "Polymorphismus (sehr einfach gesagt) ist eine Möglichkeit, eine abgeleitete Klasse zu verwenden, wo eine Basisklasse erwartet wird". In einer dynamisch typisierten Sprache wie Ruby gibt es keine "erwarteten" Klassen, weshalb Polymorphismus in diesem Fall nicht auf Ruby zutrifft? Ich bin das, was würde zum Beispiel Ente-Typisierung und Polymorphismus unterscheiden? http://stackoverflow.com/questions/3343625/why-does-wikipedia-say-polymorphism-is-not-the-same-as-method-overloading-or- – Question

Verwandte Themen