perl - 如何在 Perl Moose OOP 中动态调用对象?

标签 perl moose

这是经典的对象模型:

 class ViewBase
 {
  void DoSomethingForView() { } //May be virtual
 }

 class View1 : ViewBase //(derived class from ViewBase)
 {
    void DoSomethingForView() { }
    void DoSomethingForView1Special() { }
 }

 class View2: ViewBase //(another derived class from ViewBase)
 {
    void DoSomethingForView2Special() { }
 }

 class Application
 {
    void Print() { }
    void DoSomething() { }

     //Do some magic to create a view object (View1 or View2) and return

    //Something which I don't know to describe. Its like dynamically 
    //returning object of View1 or View2 at runtime
  }

我想将其转换为 Perl Moose 类模型。

这样,

我会像这样调用 View 方法

void Main()
{

  App = new Application();

  App->View1->DoSomethingForView(); 
  App->View1->DoSomethingForView1Special();
  App->View2->DoSomethingForView(); 
  App->View2->DoSomethingForView2Special();

我不会知道调用哪个View。但是在运行时,必须创建 View1/View2 实例并且必须调用 DoSomethingForView()。

上面的代码不完全是 Perl。如何在 Perl 中翻译和实现它。

一个Application对象应该有View对象,但是我们在编译时并不知道 View 的类型。我们有一个测试应用程序,用 Perl 开发。

你可以想象Application是一个GUI应用程序,View就是你在应用程序窗口中看到的东西。用户可以选择任何 View 。

我对我的英语感到抱歉。如果我需要提供更多文本,请告诉我。

最佳答案

因此,这为您提供了大致等效的 Perl 语法。但是,它并不能帮助您解决一些相互冲突的标准。

注意以下几点:

  • class ABC {...} 被perl语法包ABC替代;
  • 大写的驼峰式方法名称被转换为适当的“蛇形”perl。
  • App 已经变成了 sigil-ed $App

这已经针对 Moose v62、Perl 5.10 进行了测试。倒数第二行将失败,因为 do_something_for_view 不是由 View2 类实现的。当您具体调用 view1view2 时,我没有看到您似乎表示多态性的应用程序。

package ViewBase;

sub do_something_for_view { 
    Carp::croak "ViewBase::do_something_for_view is ABSTRACT!"; 
}

package View1;
use Moose;
extends 'ViewBase';

sub do_something_for_view { print "Doing something for View1.\n"; }
sub do_something_for_view1_special { print "Doing something SPECIAL for View1.\n"; }

package View2;
use Moose;
extends 'ViewBase';

sub do_something_for_view2_special() { print "Doing something SPECIAL for View2.\n"; }

package Application;
use Moose;

has view1 => ( 
      is      => 'rw'       # read/write
    , isa     => 'View1'
    , lazy    => 1
    , default => sub { View1->new(); } 
    );

has view2 => ( 
      is      => 'rw'       # read/write
    , isa     => 'View2'
    , lazy    => 1
    , default => sub { View2->new(); } 
    );

sub print {}
sub do_something {}

#void Main()
#{

package main;

  #App = new Application();
my $App = Application->new();

  #App->View1->DoSomethingForView(); 
$App->view1->do_something_for_view();
  #App->View1->DoSomethingForView1Special();
$App->view1->do_something_for_view1_special();
  #App->View2->DoSomethingForView(); 
$App->view2->do_something_for_view();
  #App->View2->DoSomethingForView2Special();
$App->view2->do_something_for_view2_special();

#}

关于perl - 如何在 Perl Moose OOP 中动态调用对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/374824/

相关文章:

html - 如何在 Perl 中轻松解析 <div class ="foo"> 和 </div>

perl - 黑白 goto &func; 有什么区别吗?和 &func;在 Perl 中?

perl - 循环遍历 perl 数组

json - Perl JSON 验证函数

Perl Moose - 从配置文件加载值时的参数是什么?

perl - 来自间接包含模块的命名空间污染

perl - 如何防止无限递归(使用 Moose)?

perl - 我可以在 Moose 中重载方法吗?

perl - 我如何需要一个不是属性的 Moose 构造函数参数?

C#:在其他方法中包装方法