我想要一个基类 Vehicle 和我的大部分系统只使用这种类型的数组。使用 Car、Airplane 等子类型。当调用 canFly 等方法时,Car 会响应 false,而 Airplane 会响应 true。
我计划使用单个 DB 表(将听取其他建议),其中子类型列指示实际子类类型和其他兄弟子类使用的列的 NULL 值。我如何在 DB 查询中拦截 Vehicle 类的创建,而是给定(子类类型)创建适当的子类?(如果这个问题不清楚,我会在周六晚上(大约 28 小时后)尝试更好地澄清。)
我想要一个基类 Vehicle 和我的大部分系统只使用这种类型的数组。使用 Car、Airplane 等子类型。当调用 canFly 等方法时,Car 会响应 false,而 Airplane 会响应 true。
我计划使用单个 DB 表(将听取其他建议),其中子类型列指示实际子类类型和其他兄弟子类使用的列的 NULL 值。我如何在 DB 查询中拦截 Vehicle 类的创建,而是给定(子类类型)创建适当的子类?(如果这个问题不清楚,我会在周六晚上(大约 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;
}