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