3

これが古典的なオブジェクトモデルです。

 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
  }

これをPerlMooseクラスモデルに変換したいと思います。

となることによって、

次のようなviewメソッドを呼び出します

void Main()
{

  App = new Application();

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

}

どのビューを呼び出すかわかりません。ただし、実行時に、View1 / View2インスタンスを作成し、DoSomethingForView()を呼び出す必要があります。

上記のコードは正確にはPerlではありません。Perlでこれを翻訳して達成する方法。

ApplicationオブジェクトにはViewオブジェクトが必要ですが、コンパイル時にビューのタイプはわかりません。テストアプリケーション、Perlでの開発があります。

アプリケーションはGUIアプリケーションであり、ビューはアプリケーションウィンドウに表示されているものであると想像できます。ユーザーは任意のビューを選択できます。

英語でごめんなさい。さらにテキストを提供する必要がある場合はお知らせください。

4

2 に答える 2

3

したがって、これにより、Perl でほぼ同等の構文が得られます。ただし、相反する基準のいくつかについては役に立ちません。

次の点に注意してください。

  • クラス ABC {...} は perl 構文パッケージ ABC に置き換えられます。
  • 大文字のキャメルケースのメソッド名は、適切な「スネークケース」の perl に変換されます。
  • アプリは印付きの $App になりました

これは、Moose v62、Perl 5.10 に対してテストされています。クラスdo_something_for_viewによって実装されていないため、最終行から 2 番目は失敗します。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();

#}
于 2008-12-17T22:20:38.593 に答える
2

MooseX::Declareを使用すると、構文を最初に書いたものと非常に似たものに単純化できる場合があります。たとえば、宣言は次のようになります。

use MooseX::Declare;
 class ViewBase {
  method DoSomethingForView() { } #May be virtual
 }

 class View1 extends ViewBase {
    method DoSomethingForView() { }
    method DoSomethingForView1Special() { }
 }

 class View2 extends ViewBase {
    method DoSomethingForView2Special() { }
 }

 class Application {
    method Print() { }
    method 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
  }
于 2010-04-13T13:27:50.833 に答える