17 Stimmen

Kann ich Java-ähnliche Schnittstellen in Perl erstellen?

Ich weiß, dass das OO-Modell von Perl ziemlich primitiv ist; es ist in den meisten Aspekten im Wesentlichen ein Namespace-Hack.

Dennoch frage ich mich, ob es möglich ist, so etwas wie eine "Schnittstelle" zu schaffen? Mein Ziel ist es, eine Basisklasse zu haben, von der andere erweitert werden, deren Hauptzweck es ist, die Implementierung bestimmter Methoden (mit Namen ist in Ordnung, keine Signatur notwendig) durch diese Unterklassen verbindlich zu machen. Es ist mir eigentlich egal, ob es sich um eine "rein virtuelle" Klasse (wie eine "Schnittstelle" in Java) oder eine konkrete Klasse mit tatsächlichen Implementierungs-Stubs für diese Methoden in der Oberklasse handelt, aber was ich möchte, ist, dass es deterministisch notwendig ist, dass die Unterklasse bestimmte Methoden der Oberklasse implementiert.

Ist das möglich? Wenn ja, wie?

30voto

Dave Rolsky Punkte 4494

Hier ist eine Antwort mit Elch ...

package Comparable;
use Moose::Role;

requires 'eq';

package Person;

has size => (
    is   => 'ro',
    does => 'Comparable',
);

Das Attribut "Größe" muss nun ein Objekt sein, das die Schnittstelle "Comparable" implementiert. Im Elchland sind Schnittstellen Rollen, und Rollen können mehr sein als nur eine Schnittstellendefinition.

11voto

Alan Haggai Alavi Punkte 69510

Ich bin mir nicht sicher, wie Sie es umsetzen können. Werfen Sie jedoch einen Blick auf Elch Das ist "Ein postmodernes Objektsystem für Perl 5".

6voto

Tatiana Racheva Punkte 1215

Ich denke, die ganze Idee, die Implementierung/Überladung von Funktionen/Subs der Basisklasse vorzuschreiben, ist Perl fremd. An welchem Punkt würden Sie sich vorstellen, dass der Durchsetzungsmechanismus funktioniert?

Wenn Sie damit einverstanden sind, dies zur Laufzeit zu tun, können Sie sterben, wenn die Implementierung Ihrer Basisklasse aufgerufen wird.

EDIT: Eigentlich, ja, Class::Contract scheint der Weg zu sein, zu gehen.

6voto

Igor Krivokon Punkte 9967

Le site Klasse::Vertrag kann dabei helfen. Es unterstützt die Vertragsprüfung zur Kompilierzeit.

2voto

Axeman Punkte 29362

Ich habe ein leichtgewichtiges Muster, das ich "Compatible" nenne, und ich bespreche es in meiner Antwort auf Wie wichtig ist es, anzugeben, ob eine Klasse eine Schnittstelle in Perl implementiert?

Es geht nur darum, Pseudo-Pakete in @ISA :

our @ISA = qw<... X::Compatible ...>;

Du brichst ihren Kodex, wenn du nicht tust, was sie von dir erwarten. X . In der Praxis habe ich eine Reihe von dokumentierten Verhaltensweisen, die ich wiederverwende, aber eine Klasse, die mir sagt, dass sie X::Compatible verwende ich, um mich zu vergewissern, dass es das tun kann, was ich erwarte.

Seit Perl 5.10 wurde die DOES Konzept, das in etwa so leichtgewichtig ist, wie ein X::Compatible Objekt erbt von einer Basisklasse Object::Compatible die eine Basisfunktion implementiert DOES durchblickend @ISA für /::Compatible$/ und alles, was dort steht, zu bejahen. Das ist die Idee dahinter:

$object->DOES( $x ) == $object->isa( $x . '::Compatible' )

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X