So con OO Perl Posso avere oggetti ed ereditarietà, ma le interfacce sono implementate? Se sì, come vengono applicati?Esiste un OO Perl equivalente a un'interfaccia?
risposta
È possibile creare una classe virtuale pura (o un ruolo se si utilizza Moose o MooseX::Declare):
package Foo;
use strict;
use Carp;
sub new { croak "new not implemented" };
sub do_x { croak "do_x not implemented" };
sub do_y { croak "do_y not implemented" };
Ma l'esecuzione sarà in fase di esecuzione. In generale, le interfacce sono necessarie perché la lingua non supporta l'ereditarietà multipla ed è tipizzata in modo rigoroso. Perl supporta l'ereditarietà multipla e (usando Moose) qualcosa come l'ereditarietà multipla (ma meglio) chiamata ruoli ed è digitato dinamicamente. La tipizzazione rigorosa vs dinamica si riduce alla digitazione (se cessa() come anatra, cammina() come un'anatra e nuota() come un'anatra, quindi è un'anatra). In Perl, tu dici:
if ($some_obj->can("quack") {
$some_obj->quack;
} else {
croak "incompatible class type: ", ref $some_obj;
}
Nel Perl OO tradizionale, viene applicato molto poco. Hai l'opzione di $ obj-> can ('methodname') per anatra-digita quello che stai usando, ma non c'è niente come un'interfaccia.
(Ma dare un'occhiata a Moose, i ruoli ci può essere quello che stai dopo.)
Ma certo! Class::Interface.
Detto questo, guarderei prima Moose. È fantastico.
Sì, giusto, CPAN ha tutto. ;-) – ijw
interfacce sono necessari perché la lingua non supporta
Interface è un concetto OOP. Non sono necessari a causa di un problema tecnico.
+1 per alci con ruoli. Soprattutto se provi da una rigida OO/preferenza, fa quello che ti piace. –
http://stackoverflow.com/questions/1341903/c-like-usage-of-moose-with-perl-for-oop – draegtun