Allgemeine Funktion

In bestimmten Systemen für die objektorientierte Programmierung wie das Allgemeine Lispeln-Gegenstand-System und Dylan ist eine allgemeine Funktion eine Entität, die aus allen Methoden zusammengesetzt ist, die denselben Namen haben. Normalerweise ist eine allgemeine Funktion selbst ein Beispiel einer Klasse, die sowohl von der Funktion als auch vom Standardgegenstand erbt. So sind allgemeine Funktionen beide Funktionen (der damit genannt und auf Argumente angewandt werden kann), und gewöhnliche Gegenstände. Das Buch Die Kunst des Metaobject Protokolls erklärt die Durchführung und den Gebrauch von CLOS allgemeinen Funktionen im Detail.

Geschmäcke sind eine der frühen objektorientierten Erweiterungen auf das Lispeln. Es hat die übliche Nachricht verwendet, Paradigma unter Einfluss des Plausches sendend. Die Syntax, für eine Nachricht in Geschmäcken zu senden, ist:

(senden Sie Gegenstand: Nachricht)

</Quelle>

Mit Neuen Geschmäcken wurde es entschieden, dass die Nachricht eine echte Funktion sein sollte und die übliche Funktionsbenennen-Syntax verwendet werden sollte:

(Nachrichtengegenstand)

</Quelle>

Nachricht ist jetzt eine allgemeine Funktion, ein Gegenstand und Funktion in seinem eigenen Recht. Individuelle Durchführungen der Nachricht werden Methoden genannt.

Dieselbe Idee wurde in CommonLoops durchgeführt. Neue Geschmäcke und CommonLoops waren der Haupteinfluss für das Allgemeine Lispeln-Gegenstand-System.

Beispiel

Allgemeines Lispeln

Definieren Sie eine allgemeine Funktion mit zwei Rahmen protestieren 1 und protestieren 2. Der Name der allgemeinen Funktion ist kollidieren.

(defgeneric kollidieren (wenden Sie 1 Gegenstand 2 ein))

</Quelle>

Methoden, die der allgemeinen Funktion gehören, werden außerhalb Klassen definiert.

Hier definieren wir eine Methode für die allgemeine Funktion kollidieren, der für den Klassenasteroiden (der erste Parameter-Gegenstand 1) und Raumschiff (der zweite Parameter-Gegenstand 2) spezialisiert wird. Die Rahmen werden als normale Variablen innerhalb des Methode-Körpers verwendet. Es gibt keinen speziellen namespace, der Zugang zu Klassenablagefächern hat.

(defmethod kollidieren ((wenden Sie 1 Asteroiden ein) (wenden Sie 2 Raumschiff ein))

(Format t "Asteroid ~a kollidiert mit dem Raumschiff ~a" wenden 1 Gegenstand 2 ein))

</Quelle>

Das Benennen der allgemeinen Funktion:

? (kollidieren Sie (Machen-Beispiel 'Asteroid) (Machen-Beispiel 'Raumschiff))

Asteroid #

</Quelle>

Allgemeines Lispeln kann auch individuelle Methoden von der allgemeinen Funktion wiederbekommen. FINDEN-METHODE findet, dass die Methode von der allgemeinen Funktion spezialisiert für den Klassenasteroiden und das Raumschiff kollidiert.

? (Finden-Methode # 'collide Null (Liste (Finden-Klasse 'Asteroid) (Finden-Klasse 'Raumschiff)))

</Quelle>

Vergleich in andere Sprachen

Allgemeine Funktionen entsprechen grob dazu, was Plausch Methoden mit der bemerkenswerten Ausnahme nennt, dass, im Plausch, die Klasse des Empfängers die alleinige Determinante ist, deren der Körper des Codes wirklich genannt wird: Die Typen oder Werte der Argumente sind (einzelne Absendung) irrelevant. Auf einer Programmiersprache mit der vielfachen Absendung, wenn eine allgemeine Funktion genannt wird, kommt Methode-Absendung auf der Grundlage von allen Argumenten, nicht nur ein einzelnes privilegiertes vor. Neue Geschmäcke haben auch allgemeine Funktionen, aber nur einzelne Absendung zur Verfügung gestellt.

Ein anderer ist die völlig getrennte Definition der allgemeinen Funktion eine Funktion, die parametrischen polymorphism verwendet. Das ist die verwendete Definition, wenn es mit einer Sprache wie OCaml arbeitet. Ein Beispiel einer allgemeinen Funktion ist

id: a-> ein

lassen Sie id = ein

</Quelle>

der ein Argument jedes Typs nimmt und etwas dieses desselben Typs zurückgibt.


Samuel Renshaw / Moslemische Welt
Impressum & Datenschutz