3

我想要一个基类 Vehicle 和我的大部分系统只使用这种类型的数组。使用 Car、Airplane 等子类型。当调用 canFly 等方法时,Car 会响应 false,而 Airplane 会响应 true。

我计划使用单个 DB 表(将听取其他建议),其中子类型列指示实际子类类型和其他兄弟子类使用的列的 NULL 值。我如何在 DB 查询中拦截 Vehicle 类的创建,而是给定(子类类型)创建适当的子类?(如果这个问题不清楚,我会在周六晚上(大约 28 小时后)尝试更好地澄清。)

4

2 回答 2

3

您要查找的内容称为DBIx::Class 中的动态子类化。在 Rails/ActiveRecord 中,他们称之为单表继承 (STI)。

我在DBIC Cookbook中链接到的页面描述了如何覆盖 inflate_result 以便您可以测试行的车辆类型,然后将其重新分配到所需的子类中。

于 2013-06-21T16:42:55.920 回答
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,您也不必传递MyObjectbless

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;
}
于 2013-06-21T16:32:53.180 回答