Perl是否值得多态?

丹尼尔·ST

在Perl中似乎有很多方法可以实现多态,但是它们对我来说都是“ hacky”。我对Perl有点陌生,所以我可能会误解它,但是我发现大多数示例会使您的代码变得难以辨认并且引起争议。

假设您有一个小部件类,其中包含一些所有小部件都需要的数据和方法。还有一些小部件类型(例如,日历,时间表等)。他们需要彼此通信(通过父容器类)。

玩命名空间并使小部件成为原型是值得的吗?
我应该在实例化时为每个小部件提供对一个对象(一种类型)的引用吗?
只需忘记类型是对象,然后将小部件变成大型类即可,根据设置的类型,每个实例仅使用几种方法。还有别的吗

我来自C / C ++背景,发现很难确定Perl编程模型。

另外,我对类型安全性要求不高,也没有私人成员的要求。该项目是一个具有几个开发人员的中型Web应用程序,可移植性不是其他项目的重点。但是,无需解密Perl hack即可轻松进行扩展将很有用。

托比墨

“现代Perl”方法可能被定义Widget为角色。可以将角色视为类似于mixin,接口或抽象基类。使用Moose :: Role或其更轻量的替代项之一(Moo :: RoleRole :: Tiny)执行此操作。

{
   package Widget;
   use Moo::Role;

   sub some_common_method {
      my $self = shift;
      ...;
   }

   sub another_common_method {
      my $self = shift;
      ...;
   }

   # Here we're indicating that all Widgets must
   # have a method called yet_another_common_method,
   # but we're not defining how that method should
   # be implemented.
   requires "yet_another_common_method";
}

现在,您可以创建一个组成该角色的类:

{
   package Calendar;
   use Moo;
   with "Widget";

   # Here's a member variable.
   has year => (is => "ro", required => 1);

   # Widget requires us to implement this.
   sub yet_another_common_method {
      my $self = shift;
      ...;
   }

   # We can override Widget's implementation
   # of this method.
   sub some_common_method {
      my $self = shift;
      ...;
   }

   # We can install hooks ("method modifiers")
   # to Widget's methods.
   before another_common_method => sub {
      my $self = shift;
      print STDERR "Calendar ", $self->year, ": another_common_method() was called.\n";
   };
}

还有一个:

{
   package Schedule;
   use Moo;
   with "Widget", "Editable";

   sub yet_another_common_method {
      my $self = shift;
      ...;
   }
}

并使用以下类:

my $calendar = Calendar->new( year => 2014 );
my $schedule = Schedule->new;

my @widgets = ($calendar, $schedule);

for (@widgets) {
   $_->some_common_method if $_->does('Widget');
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Perl是否值得多态?

来自分类Dev

如何使%var%值得多行回声?- 批

来自分类Dev

MatLab是否值得购买?

来自分类Dev

转到SimpleMembership是否值得

来自分类Dev

是否值得使用 ORM

来自分类Dev

调试信息是否值得翻译?

来自分类Dev

为了获得性能而避免多态性值得吗?

来自分类Dev

重用CUDA中的事件变量是否“值得”?

来自分类Dev

Android-是否值得使用ViewStub?

来自分类Dev

为int值创建PreparedStatement是否值得?

来自分类Dev

在转让之前是否值得检查价值?

来自分类Dev

僵尸进程是否值得我关注?

来自分类Dev

是否值得为动态属性定制框架?

来自分类Dev

是否值得删除未使用的 CSS?

来自分类Dev

如何通过自定义多态类型的集合获得多态行为?

来自分类Dev

方法是否隐藏了多态形式?

来自分类Dev

SELinux是否提供足够的额外安全性,值得值得学习/设置它的麻烦?

来自分类Dev

是否值得在Java中为原语保持常量?

来自分类Dev

用jdbc和mysql并行化查询是否值得?

来自分类Dev

当函数在android中结束时清除地图是否值得?

来自分类Dev

为接口和实现使用单独的命名空间是否值得?

来自分类Dev

尝试优化Nginx正则表达式是否值得?

来自分类Dev

在一个简单的枚举上实现parcelable是否值得

来自分类Dev

Python纯虚拟功能是否可能和/或值得?

来自分类Dev

是否有可能值得在AngularJS中获得认证?

来自分类Dev

是否值得使用多个Web跟踪器?

来自分类Dev

为Java中的空数组设置常量是否值得?

来自分类Dev

为EEPROM实现小型文件系统是否值得

来自分类Dev

在Chrome扩展程序中gzip JavaScript文件是否值得?

Related 相关文章

热门标签

归档