C ++ - 就像使用Mol和Perl一样用于OOP

时间:2009-08-27 15:39:59

标签: c++ perl oop moose

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

4 个答案:

答案 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"; }