我一直在玩Moose,感受它。我想要一个像C ++一样的纯虚函数的例子,但是用Moose的说法(特别是用C ++看)。我知道即使Moose强加了比普通Perl更严格的模型,仍然有不止一种方法可以做我想问的方法(通过方法修饰符或SUPER::
调用)。这就是为什么我要尽可能专门针对类似C ++的实现。至于“为什么?”这个限制?主要是好奇心,但也计划用一些以C ++为中心的人主要认同的方式将一些C ++代码移植到Perl。
答案 0 :(得分:5)
我可以想到这种方式使用角色而不是子类化:
{
package AbstractRole;
use Moose::Role;
requires 'stuff';
}
{
package Real;
use Moose;
with 'AbstractRole';
}
这会产生编译错误,因为Real没有定义 stuff 。
将 stuff 方法添加到Real现在可以使其正常工作:
{
package Real;
use Moose;
with 'AbstractRole';
sub stuff { print "Using child function!\n" }
}
答案 1 :(得分:5)
您可能还想看看Jesse Luehrs' MooseX::ABC。 它似乎与这里的一些实现非常相似。从概要:
package Shape;
use Moose;
use MooseX::ABC;
requires 'draw';
package Circle;
use Moose;
extends 'Shape';
sub draw {
# stuff
}
my $shape = Shape->new; # dies
my $circle = Circle->new; # succeeds
package Square;
use Moose;
extends 'Shape'; # dies, since draw is unimplemented
我知道Jesse是白天的C ++程序员。
答案 2 :(得分:2)
看来我不能完全按照我的意愿去做,但是我可以与角色非常接近。以下是Moose手册entry中有关角色的信息:
角色与抽象基础类
如果您熟悉这个概念 其他的抽象基类 语言,你可能会被诱惑使用 角色以同样的方式。
您可以定义“仅限界面” 角色,只包含一个列表 必要的方法。
然而,任何消耗此类的课程 角色必须实现所有的 必要的方法,直接或 通过从父母继承。您 不能延迟方法要求 检查以便它们可以实施 通过未来的子类。
因为角色定义了必需的 方法直接,添加基类 混合不会取得任何成果。 我们建议您只需消费 每个类中的接口角色 实现该接口。
答案 3 :(得分:1)
这是我的尝试(没有角色,有关角色的信息,请参阅其他答案):
package Abstract;
use Moose;
sub stuff;
package Real;
use Moose;
extends 'Abstract';
override 'stuff' => sub { print "Using child function!\n"; }