我知道 Perl 的 OO 模型相当原始。在大多数方面,它本质上是一个命名空间黑客。
不过,我想知道是否有可能创建类似“界面”的东西?我的目标是拥有一个基类,从其扩展其他基类,其主要目的是强制这些子类执行某些方法(按名称很好,不需要签名)。我真的不在乎它是“纯虚拟”类(如 Java 中的“接口”)还是具有超类中这些方法的实际实现存根的具体类,但我想要的是使其具有确定性的必要性子类实现超类的某些方法。
这可能吗?如果是这样,怎么做?
这是使用Moose的答案...
package Comparable;
use Moose::Role;
requires 'eq';
package Person;
has size => (
is => 'ro',
does => 'Comparable',
);
现在 size 属性必须是一个实现 Comparable “接口”的对象。在 Moose-land 中,接口是角色,角色可以不仅仅是一个接口定义。
我认为强制实现/重载基类的函数/子类的整个想法对 Perl 来说是陌生的。您认为执法机制在什么时候起作用?
如果您可以在运行时执行此操作,那么如果您的基类的实现被调用,您可能会死掉。
编辑:实际上,是的,Class::Contract 似乎是要走的路。
Class::Contract可以帮助解决这个问题。它支持编译时合约检查。
我有一个轻量级模式,我称之为“兼容”,我在回答“表明一个类是否在 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' )
在运行时创建错误的简单解决方案:
package SomeVirtualClass;
use strict;
use warnings;
use Carp;
sub some_method { croak "virtual method some_method not overridden" }