簡體   English   中英

Perl with Catalyst和DBIx :: Class - 如何在繼承樹中加載一組類?

[英]Perl with Catalyst and DBIx::Class - How to load a sets of classes in an inheritance tree?

我想有一個基類Vehicle和我的大部分系統只使用這種類型的ARRAY。 使用Carty,Airplane等子類型。當調用canFly等方法時,Car會響應false,而Airplane會響應true。

我打算使用單個數據庫表(將聽取其他建議),其中子類型列指示實際的子類類型和其他同級子類使用的列的NULL值。 我如何在DB查詢中攔截Vehicle類的創建,而不是給定(subclasstype)創建適當的子類? (如果這個問題不明確,我會在周六晚上(從現在開始大約28小時)嘗試澄清。))

你在尋找什么叫做DBIx :: Class中的動態子類。 在Rails / ActiveRecord中,他們稱之為單表繼承(STI)。

我鏈接到的頁面在DBIC Cookbook中描述了如何覆蓋inflate_result,以便您可以測試行的車輛類型,然后將其重新放入所需的子類中。

傳統的構造函數如下所示:

package MyObject;
sub new {
    my ($package, @args) = @_;
    my $self = { };
    ... use @args, initialize $self ...
    return bless $self, $package;    # or sometimes  bless $self,__PACKAGE__
}

這是bless語句,為$self的數據結構分配“類型”。 通常, bless的第二個參數是當前包的名稱。 但這是Perl,所以你並不總是以通常的方式做事。 即使在MyObject的構造函數中,您也不MyObject傳遞給bless

package MyObject;
sub new {
    my ($package, %args) = @_;
    my $self = { };
    ... use @args, initialize $self ...
    if ($args{"type"} == 1)    { $package = "MyObject::Foo"; }
    elsif ($args{"type"} == 2) { $package = "MyObject::Bar"; }
    elsif ($args{"type"} == 3) { ... }
    return bless $self, $package;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM