17

我知道 Perl 的 OO 模型相当原始。在大多数方面,它本质上是一个命名空间黑客。

不过,我想知道是否有可能创建类似“界面”的东西?我的目标是拥有一个基类,从其扩展其他基类,其主要目的是强制这些子类执行某些方法(按名称很好,不需要签名)。我真的不在乎它是“纯虚拟”类(如 Java 中的“接口”)还是具有超类中这些方法的实际实现存根的具体类,但我想要的是使其具有确定性的必要性子类实现超类的某些方法。

这可能吗?如果是这样,怎么做?

4

6 回答 6

30

这是使用Moose的答案...

package Comparable;
use Moose::Role;

requires 'eq';

package Person;

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

现在 size 属性必须是一个实现 Comparable “接口”的对象。在 Moose-land 中,接口是角色,角色可以不仅仅是一个接口定义。

于 2009-07-02T13:23:37.737 回答
11

我不确定您将如何实现它。但是,请看一下Moose,它是“Perl 5 的后现代对象系统”。

于 2009-07-02T04:15:19.223 回答
6

我认为强制实现/重载基类的函数/子类的整个想法对 Perl 来说是陌生的。您认为执法机制在什么时候起作用?

如果您可以在运行时执行此操作,那么如果您的基类的实现被调用,您可能会死掉。

编辑:实际上,是的,Class::Contract 似乎是要走的路。

于 2009-07-02T04:23:00.990 回答
6

Class::Contract可以帮助解决这个问题。它支持编译时合约检查。

于 2009-07-02T04:23:47.480 回答
2

我有一个轻量级模式,我称之为“兼容”,我在回答“表明一个类是否在 Perl 中实现接口有多重要? ”中讨论了它。

只需将伪包粘贴在@ISA

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

如果你不按照他们的期望去做,你就会破坏他们的代码X。在实践中,我有一堆我重用的记录在案的行为,但是一个类告诉我这X::Compatible是我用来向自己保证它可以做我期望的事情。

由于 perl 5.10 引入了DOES轻量级的概念,因此X::Compatible对象继承自基类,该基类通过查找并回答其中的任何内容来Object::Compatible实现基类。这个想法是:DOES@ISA/::Compatible$/

$object->DOES( $x ) == $object->isa( $x . '::Compatible' )
于 2009-07-02T14:52:11.830 回答
1

在运行时创建错误的简单解决方案:

package SomeVirtualClass;

use strict;
use warnings;

use Carp;

sub some_method { croak "virtual method some_method not overridden" }
于 2009-07-02T04:21:06.793 回答