6

我一直在和 Moose 一起玩,感受一下。我想要一个纯虚函数的例子,比如 C++,但用 Moose 的说法(特别是以 C++ 的方式)。我知道,即使 Moose 采用比普通 Perl 更严格的模型,仍然有不止一种方法可以完成我的要求(通过方法修饰符或SUPER::调用)。这就是为什么我特别要求尽可能地类似于 C++ 的实现。至于“为什么?” 这个限制?主要是出于好奇,但也计划将一些 C++ 代码移植到带有 Moose 的 Perl 中,以一种以 C++ 为中心的人能认同的方式。

4

4 回答 4

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++ 程序员。

于 2009-08-27T20:46:12.017 回答
5

我可以使用角色而不是子类来考虑这种方式:

{
    package AbstractRole;
    use Moose::Role;
    requires 'stuff';  
}

{
    package Real;
    use Moose;
    with 'AbstractRole';
}

这将产生编译错误,因为 Real 没有定义任何东西

现在将stuff方法添加到 Real 将使其工作:

{
    package Real;
    use Moose;
    with 'AbstractRole';

    sub stuff { print "Using child function!\n" }
}
于 2009-08-27T17:28:45.627 回答
2

看来我不能完全用 Moose 做我想做的事,但我可以用 Roles 非常接近。以下是来自 Moose角色手册条目的信息:

角色与抽象基类

如果您熟悉其他语言中抽象基类的概念,您可能会想以同样的方式使用角色。

您可以定义“仅接口”角色,该角色仅包含所需方法的列表。

但是,任何使用此角色的类都必须实现所有必需的方法,要么直接实现,要么通过从父类继承。您不能延迟方法要求检查,以便将来的子类可以实现它们。

因为角色直接定义了所需的方法,所以将基类添加到混合中不会有任何效果。我们建议您在实现该接口的每个类中简单地使用接口角色。

于 2009-08-27T17:24:08.727 回答
1

这是我的尝试(没有角色,有关角色的信息,请参阅其他答案):

package Abstract;
use Moose;

sub stuff;

package Real;
use Moose;
extends 'Abstract';

override 'stuff' => sub { print "Using child function!\n"; }
于 2009-08-27T15:51:04.217 回答