Can I create Java-like interfaces in Perl?

大兔子大兔子 提交于 2019-11-30 05:03:28

I think the whole idea of mandating implementation/overloading of base class's functions/subs is foreign to Perl. At which point would you envision the enforcement mechanism working?

If you're OK with doing this at runtime, you can die if your base class's implementation gets called.

EDIT: Actually, yes, Class::Contract seems to be the way to go.

Dave Rolsky

Here's an answer using Moose ...

package Comparable;
use Moose::Role;

requires 'eq';

package Person;

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

Now the size attribute must be an object which implements the Comparable "interface". In Moose-land, interfaces are roles, and roles can be more than just an interface definition.

I am not sure how you will be able to implement it. However, have a look at Moose, which is "A postmodern object system for Perl 5".

The Class::Contract can help with this. It supports compile-time contract checking.

Axeman

I have a lightweight pattern I call "Compatible", and I discuss it in my answer to How important is it to indicate if a class implements an interface in Perl?

It's just a matter of sticking pseudo packages in @ISA:

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

You break their code if you don't do what they expect from X. In practice I have a bunch of documented behaviors that I reuse, but a class telling me it's X::Compatible is what I use to assure myself that it can do what I expect.

Since perl 5.10 has introduced the DOES concept, which is about as lightweight, a X::Compatible object inherits from a base class Object::Compatible which implements a base DOES by looking through @ISA for /::Compatible$/ and replying to the affirmative for anything in there. The idea is that:

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

Simple solution that creates errors at runtime:

package SomeVirtualClass;

use strict;
use warnings;

use Carp;

sub some_method { croak "virtual method some_method not overridden" }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!