[英]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.