首先,不要打電話給你的方法new
稱之爲promote
或類似的東西。
我有混合如何處理這樣的設計感受。我最初的反應是你應該使用訪問器方法並'手動'將值複製到一個新的對象中。
sub promote {
my $class = shift;
my $obj = shift;
my %args = map { $_ => $obj->$_ } qw(
attribute
another
this_one
that_one
);
return $class->new(%args);
}
這會使您的子類與父類中的更改隔離。
你的父類現在可能成爲一個裏面的對象或其他不是clone
的東西。父代中的關鍵屬性可能會被一個從其他屬性生成的方法取代。
很顯然,父母與孩子之間的一定程度的耦合是不可避免的。但是這種方法有助於最小化它。
另一種看起來很明顯的方法是使用clone
,像jkramer所暗示的那樣是不合格的。這個最大的問題是,你有這些限制:
- 你的父類的對象必須是可克隆
- 你的父母和孩子的類必須相同地實現存儲。
- 訪問/ mutator方法不得使用屬性訪問類的名稱前綴。這意味着,Foo類專賣店在
$self->{'Foo::attrib'} = 'value';
attrib
而富::酒吧把它們存儲在$self->{'Foo::Bar::attrib'} = 'value';
對於克隆,我會用Storable
的dclone
。它具有作爲核心模塊的優勢,並且許多更具異國情調的對象實現爲Storable提供了掛鉤,以便克隆可以正常工作。
如果我想讓這個類更具普遍性,那麼應該更好地顯式指定要複製的屬性。 而你的方式看起來更原子。 – Galaxy 2010-06-24 05:07:05