2009-07-02 18 views
11

Capisco che il modello OO di Perl sia piuttosto primitivo; è, per molti aspetti, essenzialmente un hack dello spazio dei nomi.Posso creare interfacce tipo Java in Perl?

Tuttavia, mi chiedo se sia possibile creare qualcosa come "un'interfaccia?" Il mio obiettivo è quello di avere una classe base da cui altri sono estesi il cui scopo principale è quello di rendere obbligatoria l'implementazione di determinati metodi (per nome va bene, nessuna firma necessaria) da quelle sottoclassi. Non mi interessa davvero se si tratta di una classe "puramente virtuale" (come una "interfaccia" in Java) o di una classe concreta con stub implementativi effettivi per quei metodi nella superclasse, ma ciò che voglio è rendere deterministicamente necessario che il la sottoclasse implementa determinati metodi della superclasse.

È possibile? Se é cosi, come?

+6

L'OO di Perl non è primitivo, è solo un modo diverso di avvicinarsi al concetto. –

+0

Penso che intendesse primitivo in termini di funzionalità offerte. OO ha alcuni principi guida e l'incapsulamento è uno di questi. Perl sta eseguendo (per la maggior parte del tempo) l'incapsulamento per convenzione, a meno che non si utilizzino le librerie più moderne, quindi sì, OO di Perl è primitivo, facendo affidamento sui futuri sviluppatori per mantenere la convenzione invece del rigoroso controllo del tempo di compilazione. Voglio dire, questa persona sta chiedendo un'interfaccia/classi virtuali pure, e non è lì senza estensioni. Questo non è "pienamente descritto". –

risposta

5

penso che l'intera idea di mandato implementazione/sovraccarico di funzioni della classe base/Subs è straniero a Perl. A che punto penseresti che funzionerà il meccanismo di applicazione?

Se è possibile eseguire questa operazione in fase di esecuzione, è possibile morire se viene richiamata l'implementazione della classe base.

MODIFICA: In realtà, sì, Classe: Il contratto sembra essere la strada da percorrere.

10

Non sono sicuro di come sarà possibile implementarlo. Tuttavia, dai un'occhiata a Moose, che è "Un sistema oggetto postmoderno per Perl 5".

+8

Con Moose, i ruoli possono eseguire la funzione di un'interfaccia Java. Possono anche fare di più, ma un ruolo che ha solo una lista di metodi richiesti è un'interfaccia. –

1

soluzione semplice che crea gli errori in fase di esecuzione:

package SomeVirtualClass; 

use strict; 
use warnings; 

use Carp; 

sub some_method { croak "virtual method some_method not overridden" } 
+0

Beh, sì, senza dubbio questa è una possibilità. Ad essere onesti, però, stavo cercando qualcosa a un livello più semantico. –

5

Il Class::Contract può essere d'aiuto. Supporta il controllo del contratto in fase di compilazione.

26

Ecco una risposta utilizzando Moose ...

package Comparable; 
use Moose::Role; 

requires 'eq'; 

package Person; 

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

Ora l'attributo dimensione deve essere un oggetto che implementa il "interfaccia" Comparable. In Moose-land, le interfacce sono ruoli e i ruoli possono essere più di una semplice definizione di interfaccia.

2

Ho un modello leggero che io chiamo "Compatibile", e io discuterne nella mia risposta alla How important is it to indicate if a class implements an interface in Perl?

E 'solo una questione di attaccare pacchetti pseudo in @ISA:

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

Si interrompe il loro codice se non fai quello che si aspettano da X. In pratica ho un sacco di comportamenti documentati che riuso, ma una classe che mi dice che è X::Compatible è quello che uso per assicurarmi che possa fare ciò che mi aspetto.

Dal perl 5.10 ha introdotto il concetto DOES, che è quanto di più leggero, un oggetto X::Compatible eredita da una classe base Object::Compatible che implementa una base DOES, cercando attraverso @ISA per /::Compatible$/ e rispondere ai affermativa per qualsiasi cosa in là.L'idea è quella:

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