我一直在玩Moose,感受它。我想要一个像C++中的纯虚函数的例子,但用Moose的说法(特别是以C++的方式)。我知道,即使穆斯强加一个比普通Perl更严格的模型,仍然有不止一种方法可以做我正在问的东西(通过方法修饰符或调用SUPER::
)。这就是为什么我特意要求尽可能类似于C++的实现。至于“为什么?”这个限制?主要是好奇心,但也计划将一些C++代码移植到Moose的Perl中,以C++为中心的人可以认为主要是。C++ - 与Perl一样用于OOP的Moose
回答
我能想到的使用角色,而不是子类的这样:
{
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" }
}
是的,如果我只想要一个界面,这是如何实现的。我通过研究和这里的讨论发现,我可能无法做到我想做的事。 – 2009-08-27 17:33:10
我认为这可以让你尽情享受。如果您觉得在进一步扩展这方面有好处,请在irc.perl.org上的#moose或邮件列表[email protected]上与Moose伙伴聊天。 – draegtun 2009-08-27 17:40:35
@draegtun是的,我认为这是我所希望的最好的近似值。谢谢你的帮助! – 2009-08-27 18:24:15
这里是我的尝试(不角色,对角色看资料其他答案):
package Abstract;
use Moose;
sub stuff;
package Real;
use Moose;
extends 'Abstract';
override 'stuff' => sub { print "Using child function!\n"; }
我不知道你在说什么,但它好像你想'抽象'是一个抽象的基类和'东西'方法(不是函数)是纯虚拟的。只是写'sub stuff {}'立即违反了这一点。所以,基类方法应该是'sub stuff {croak}'。 – 2009-08-27 16:06:30
@Sinan我正在寻找类似于C++的东西:virtual void stuff()= 0; – 2009-08-27 16:44:06
@Sinan我有两个问题需要加入:1)它没有为我编译,2)你可能会认为croak是一种实现形式,除非我误解了纯虚函数的定义)与我所要做的完全相反。我在编辑子文件{; }是次要的东西; – 2009-08-27 17:00:24
看来我不能做什么我想和驼鹿,但是我可以非常接近与角色。下面是从麋手动entry信息的角色:
角色对战抽象基类
如果您熟悉抽象基类的其他 语言概念 ,你可能会以相同的方式使用 角色。
您可以定义一个“仅接口” 角色,其中只包含所需方法的列表。
但是,消耗此 角色的任何类都必须通过从父级继承来实现所有必需的方法,或者直接执行或通过 执行。您 不能延迟方法要求 检查,以便它们可以由未来的子类实现 。
由于该角色直接定义了所需的 方法,因此将基类 添加到混合中将无法实现任何功能。 我们建议您简单地使用 这个接口实现的每个类中的接口角色。
snap!你的答案就像我正在整理我的;-) – draegtun 2009-08-27 17:32:33
@draegtun有趣的是如何发生的!你的回答是非常有用的,特别是对于那些想要实现与Moose接口的人。我刚想出一个古怪的问题,我通过进一步的研究发现可能没有确定性的答案。我仍然试图决定是否这是因为我在询问之前完全不了解该区域,或者如果穆斯缺少这个功能;) – 2009-08-27 17:39:49
嗯。这仅仅是我还是帮助其实不是很有帮助?它似乎说'如果你想用一个角色实现一个抽象类,它不起作用,因为它们不是同一件事;相反,*看那边,一只飞行的猪*! (a)如何做抽象类的层次结构(特别是如果MooseX :: ABC被认为是好的)或者(b)为什么ABCs对于Moose程序是不好的。 – ijw 2009-09-03 14:58:46
你可能也想看看杰西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++程序员。
感谢您的提示,我一定会检查出来! – 2009-08-27 22:34:59
从指向版本0.20更新到当前版本的链接。版本0.30增加了抽象基类与更多抽象类的子类化。 – spazm 2011-04-27 01:04:24
- 1. 如何将Perl Moose与插件一起用于主对象?
- 2. Moose Perl的UML工具
- 3. moose perl方法修饰符
- 4. 提及Perl/Moose包名称的速记?
- 5. 对于(1)总是和perl一样吗?
- 6. 初步OOP用C
- 7. 如何在Moose对象中使用Perl的File :: Find?
- 8. Moose渲染哪些模块无用,或与现代Perl不兼容?
- 9. 在运行时是否有一个用于将YAML文件动态转换为Moose对象的Perl模块?
- 10. C++ OOP和PHP OOP之间的区别
- 11. Python,Perl和C/C++与GUI
- 12. 我应该如何使用Perl存储和压缩Moose对象?
- 13. Perl Moose方法修饰符:在'之前'和'之后'调用'around'
- 14. 相当于用于Ruby,Perl的Perl Modulino?
- 15. 安装的模块Perl 6的失败 - 可用于Perl v6.c
- 16. createjs.Shape()不适用于OOP JavaScript
- 17. C#简单图书馆项目与OOP
- 18. 可以将ithreads与Moose懒惰属性一起使用吗?
- 19. C++ OOP编程
- 20. OOP与回调
- 21. OOP - 怎样才能在ReasonML
- 22. 用于编程乐高NXT的C++ OOP库
- 23. Moose(Perl):访问基类中的属性定义
- 24. 我应该如何控制Perl Moose对象的版本?
- 25. 如何动态获取(非Moose)Perl库中的方法列表?
- 26. 在Perl Moose或Moo中的属性代理
- 27. 哪个推荐的Perl模块可以序列化Moose对象?
- 28. AS3 OOP MVC与PHP
- 29. Perl语句等价于C
- 30. Perl Moose添加实例属性无类属性
我把我的尝试从问题转移到答案部分。 – 2009-08-27 15:51:41
Yikes,这个问题已经是第三个回应了,在Perl中使用Moose搜索纯虚函数。对于那些感兴趣的,与此有关的perlmonks讨论在这里:http://www.perlmonks.org/?node_id=742013。他们在那里似乎也没有具体的答案。 – 2009-08-27 16:52:41
可能因为除C++程序员之外的每个人都称他们为“方法”。 – jrockway 2009-08-28 07:14:37