这是经典的对象模型:
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
类实现的。当您具体调用 view1
或 view2
时,我没有看到您似乎表示多态性的应用程序。
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/