2013-06-21 6 views
3

Я хотел бы иметь базовый класс Vehicle и большую часть моей системы, чтобы использовать ARRAY этого типа. С подтипами, такими как «Автомобиль», «Самолет» и т. Д. При вызове метода, такого как canFly, автомобиль ответил бы ложно, в то время как самолет был бы правдивым.Perl с Catalyst и DBIx :: Class - Как загрузить набор классов в дереве наследования?

Я планирую использовать одну таблицу DB (будет слушать другие предложения) с столбцом подтипа, указывающим фактический тип подкласса и значения NULL для столбцов, используемых другими подклассами sibling. Как я могу при запросе БД перехватить создание классов Vehicle и, скорее, дать (subclasstype), создать соответствующий подкласс? (Если этот вопрос не ясно, я попытаюсь разъяснить лучше в субботу вечером (около 28 часов в настоящее время).)

+0

DBI.pm или DBIx :: Class.pm? –

+0

DBIx :: Class.pm как указано в теме – melutovich

+0

У меня хорошие дни и плохие дни ... –

ответ

3

Что вы ищете называется Dynamic Subclassing в DBIx :: Class. В Rails/ActiveRecord они называют его одиночным наследованием (STI).

Страница, на которую я связан, находится в DBIC Cookbook, описывает, как переопределить inflate_result, чтобы вы могли проверить тип транспортного средства вашей строки, а затем отбросить его в желаемый подкласс.

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; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^