2009-08-27 78 views
6

我一直在玩Moose,感受它。我想要一个像C++中的纯虚函数的例子,但用Moose的说法(特别是以C++的方式)。我知道,即使穆斯强加一个比普通Perl更严格的模型,仍然有不止一种方法可以做我正在问的东西(通过方法修饰符或调用SUPER::)。这就是为什么我特意要求尽可能类似于C++的实现。至于“为什么?”这个限制?主要是好奇心,但也计划将一些C++代码移植到Moose的Perl中,以C++为中心的人可以认为主要是C++ - 与Perl一样用于OOP的Moose

+0

我把我的尝试从问题转移到答案部分。 – 2009-08-27 15:51:41

+1

Yikes,这个问题已经是第三个回应了,在Perl中使用Moose搜索纯虚函数。对于那些感兴趣的,与此有关的perlmonks讨论在这里:http://www.perlmonks.org/?node_id=742013。他们在那里似乎也没有具体的答案。 – 2009-08-27 16:52:41

+0

可能因为除C++程序员之外的每个人都称他们为“方法”。 – jrockway 2009-08-28 07:14:37

回答

5

我能想到的使用角色,而不是子类的这样:

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

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

这会给出一个编译错误,因为真正没有东西定义。

添加东西方法实现将使其工作:

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

    sub stuff { print "Using child function!\n" } 
} 
+0

是的,如果我只想要一个界面,这是如何实现的。我通过研究和这里的讨论发现,我可能无法做到我想做的事。 – 2009-08-27 17:33:10

+0

我认为这可以让你尽情享受。如果您觉得在进一步扩展这方面有好处,请在irc.perl.org上的#moose或邮件列表[email protected]上与Moose伙伴聊天。 – draegtun 2009-08-27 17:40:35

+0

@draegtun是的,我认为这是我所希望的最好的近似值。谢谢你的帮助! – 2009-08-27 18:24:15

1

这里是我的尝试(不角色,对角色看资料其他答案):

package Abstract; 
use Moose; 

sub stuff; 

package Real; 
use Moose; 
extends 'Abstract'; 

override 'stuff' => sub { print "Using child function!\n"; } 
+0

我不知道你在说什么,但它好像你想'抽象'是一个抽象的基类和'东西'方法(不是函数)是纯虚拟的。只是写'sub stuff {}'立即违反了这一点。所以,基类方法应该是'sub stuff {croak}'。 – 2009-08-27 16:06:30

+0

@Sinan我正在寻找类似于C++的东西:virtual void stuff()= 0; – 2009-08-27 16:44:06

+0

@Sinan我有两个问题需要加入:1)它没有为我编译,2)你可能会认为croak是一种实现形式,除非我误解了纯虚函数的定义)与我所要做的完全相反。我在编辑子文件{; }是次要的东西; – 2009-08-27 17:00:24

2

看来我不能做什么我想和驼鹿,但是我可以非常接近与角色。下面是从麋手动entry信息的角色:

角色对战抽象基类

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

您可以定义一个“仅接口” 角色,其中只包含所需方法的列表。

但是,消耗此 角色的任何类都必须通过从父级继承来实现所有必需的方法,或者直接执行或通过 执行。您 不能延迟方法要求 检查,以便它们可以由未来的子类实现 。

由于该角色直接定义了所需的 方法,因此将基类 添加到混合中将无法实现任何功能。 我们建议您简单地使用 这个接口实现的每个类中的接口角色。

+0

snap!你的答案就像我正在整理我的;-) – draegtun 2009-08-27 17:32:33

+0

@draegtun有趣的是如何发生的!你的回答是非常有用的,特别是对于那些想要实现与Moose接口的人。我刚想出一个古怪的问题,我通过进一步的研究发现可能没有确定性的答案。我仍然试图决定是否这是因为我在询问之前完全不了解该区域,或者如果穆斯缺少这个功能;) – 2009-08-27 17:39:49

+2

嗯。这仅仅是我还是帮助其实不是很有帮助?它似乎说'如果你想用一个角色实现一个抽象类,它不起作用,因为它们不是同一件事;相反,*看那边,一只飞行的猪*! (a)如何做抽象类的层次结构(特别是如果MooseX :: ABC被认为是好的)或者(b)为什么ABCs对于Moose程序是不好的。 – ijw 2009-09-03 14:58:46

5

你可能也想看看杰西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 

我知道,杰西是白天一个C++程序员。

+0

感谢您的提示,我一定会检查出来! – 2009-08-27 22:34:59

+0

从指向版本0.20更新到当前版本的链接。版本0.30增加了抽象基类与更多抽象类的子类化。 – spazm 2011-04-27 01:04:24