2013-06-21 3 views
3

기본 클래스 인 Vehicle과 대부분의 시스템에서이 유형의 ARRAY 만 사용하고 싶습니다. Car, Airplane 등과 같은 하위 유형이있는 경우 canFly a Car와 같은 메소드를 호출하면 false가 반환되고 Airplane은 true로 응답합니다.Perl with Catalyst와 DBIx :: Class - 상속 트리에서 클래스 세트를로드하는 방법?

실제 하위 클래스 유형을 나타내는 하위 유형 열과 다른 형제 하위 클래스에서 사용되는 열의 NULL 값을 사용하여 단일 DB 테이블 (다른 제안 사항을 경청합니다)을 사용할 계획입니다. 어떻게하면 DB 쿼리에서 Vehicle 클래스 생성을 가로 채고 적절한 서브 클래스를 생성 (subclasstype) 할 수 있습니까? (이 질문이 명확하지 않으면 나는 (약 28 시간 지금부터 더 좋은 토요일 밤을 명확히하기 위해 시도합니다).)

+0

DBI.pm 또는 DBIx :: Class.pm? –

+0

제목에 표시된대로 DBIx :: Class.pm – melutovich

+0

좋은 날씨와 나쁜 날이 있습니다 ... –

답변

3

당신이 DBIx :: 클래스에 Dynamic Subclassing라고 찾고. Rails/ActiveRecord에서는 STI (Single Table Inheritance)라고 부릅니다.

내가 링크 한 페이지가 DBIC Cookbook 인 경우 inflate_result를 재정 의하여 행의 차량 유형을 테스트 한 다음 원하는 하위 클래스로 다시 채우는 방법을 설명합니다.

1

종래의 생성자 보이는 같은 : 그것은을 할당 bless 문입니다

package MyObject; 
sub new { 
    my ($package, @args) = @_; 
    my $self = { }; 
    ... use @args, initialize $self ... 
    return bless $self, $package; # or sometimes bless $self,__PACKAGE__ 
} 

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