我想有一个基类Vehicle和我的大多数系统只使用这种类型的ARRAY。使用Carty,Airplane等子类型。当调用canFly等方法时,Car会响应false,而Airplane会响应true。
我计划使用单个数据库表(将侦听其他建议),其中子类型列指示实际子类类型和其他同级子类使用的列的NULL值。我如何在DB查询中拦截Vehicle类的创建,而不是给定(subclasstype)创建适当的子类? (如果这个问题不明确,我将在周六晚上(从现在起约28小时)尝试澄清。)
答案 0 :(得分:3)
你在寻找什么在DBIx :: Class中被称为Dynamic Subclassing。在Rails / ActiveRecord中,他们称之为单表继承(STI)。
我链接到的页面DBIC Cookbook描述了如何覆盖inflate_result,以便您可以测试行的车辆类型,然后将其重新放入所需的子类中。
答案 1 :(得分:1)
传统的构造函数如下所示:
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;
}