2009-09-02 15 views

Odpowiedz

16

Można utworzyć czystego wirtualnej klasy (lub roli, jeśli używasz Moose lub 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" }; 

Ale egzekwowanie będzie w czasie wykonywania. Ogólnie rzecz biorąc, interfejsy są potrzebne, ponieważ język nie obsługuje dziedziczenia wielokrotnego i jest ściśle wpisany. Perl obsługuje wielokrotne dziedziczenie i (używając łosia) coś takiego jak dziedziczenie wielokrotne (ale lepsze) zwane rolami i jest dynamicznie wpisywane. Ścisłe i dynamiczne pisanie sprowadza się do typowania typu "kaczka" (jeśli to szarpie() jak kaczka, spacery() jak kaczka i pływa() jak kaczka, to jest kaczka). W Perlu mówisz:

if ($some_obj->can("quack") { 
    $some_obj->quack; 
} else { 
    croak "incompatible class type: ", ref $some_obj; 
} 
11

W tradycyjnym Perl OO bardzo mało jest egzekwowane. Masz opcję $ obj-> can ('methodname'), która pozwala używać typu "kaczka", ale nie ma to jak interfejs.

(Ale spojrzeć na łosie, Role tam może być to, co jesteś po.)

+0

+1 dla łosia z rolami. Zwłaszcza jeśli pochodzisz ze ściśle określonego tła/preferencji OO, robi to, co lubisz. –

+0

http://stackoverflow.com/questions/1341903/c-like-usage-of-moose-with-perl-for-oop – draegtun

10

Ale oczywiście! Class::Interface.

Powiedziałem, że najpierw spojrzę na Moose'a. To jest fantastyczne. Potrzebne są

+1

Tak, prawda, CPAN ma wszystko. ;-) – ijw

1

interfejsy ponieważ język nie obsługuje

interfejs jest pojęciem OOP. Nie są potrzebne z powodu problemów technicznych.

Powiązane problemy