2009-10-25 44 views
11

我讀Programming Perl,我發現這個代碼片段:在對象實例上調用new有什麼好處?

sub new { 
    my $invocant = shift; 
    my $class = ref($invocant) || $invocant; 
    my $self = { 
     color => "bay", 
     legs => 4, 
     owner => undef, 
     @_,     # Override previous attributes 
    }; 
    return bless $self, $class; 
} 

有了這樣一個構造函數,你對一個對象實例調用new的好處?我認爲這是它的目的,對吧?我的猜測是,如果任何人想寫這樣的構造函數,他將不得不添加一些代碼,將第一個對象的屬性複製到即將創建的對象。

+0

注意:一些非常好的信息在相關問:http://stackoverflow.com/questions/1621373/whats-the-benefit-of-calling-new-on-an-object-instance?rq= 1 – DVK 2013-06-18 14:09:10

+0

大聲笑,我現在正在閱讀同一本書 – 2013-06-19 01:37:28

回答

12

所以你可以構造同一類的其他對象不知道原來的類的對象是什麼 - 這可以使一些非常整潔緊湊的工廠模式。

舉個例子,當你有你需要構建資源對象,這是有用的,必要的時候,計算成本哪種資源對象的高(比方說,一個長期運行的數據庫查詢)。因此,工廠會看到,如果它是通過一箇舊的資源對象,如果是這樣,僅僅通過調用$old_object->new()創建一個只是喜歡它 - 避免重新計算資源的種類的資源成本。

再舉一個例子,如果你的類層次結構,表示動物,和工廠在仿真構造新的動物,你可以調用$newborn = $factory->make_new_animal($mother)與工廠實現是僅僅是$object->new()

+0

該函數不會複製原始實例中的任何內容。它只是使用'ref($ self)'得到類名,沒有別的。之後,它創建一個全新的對象。 – 2009-10-25 17:00:26

+0

盧卡斯 - 是的,沒有仔細閱讀代碼......手指發癢:)我編輯了「拷貝構造函數」參考,當你評論它的時候:) – DVK 2009-10-25 17:01:34

+1

@DVK:也許你可以展示一個例子嗎? – ysth 2009-10-25 18:57:28

7

我沒有看到任何實際的好處。你總是可以做ref($obj)->new或有辦法做$obj->clone;這樣你就不會疑惑那兩個$object->new正在做什麼。

+0

ysth - 查看我的答案。如果你的基類有「像我這樣的」新方法,那麼就可以實現一些非常類似工廠的東西。 – DVK 2009-10-25 18:41:07

+1

@DVK:然後用make_one_like_me方法做得更好。 – ysth 2009-10-25 18:56:49

+1

可以做 - 是。 「更好」 - 值得商榷。我覺得這兩本書都很好,書中的內容更加明顯,而且略微簡單。 – DVK 2009-10-25 19:08:55

5

正如其他人所說,這是允許的多態創建一個新的對象實例,而不必知道該實例的類型。

至於對象克隆,我通常編寫可以正確複製屬性和其他數據的顯式clone()或copy()方法,但沒有理由爲什麼new()無法處理此角色,只要因爲它清楚地記錄在案。但是我看到兩個優勢轉化爲分別將它們定義:

  1. 能夠使用不同的類(一個孩子,或混入/角色(如駝鹿角色))來覆蓋各種行爲
  2. 製作的潛力代碼更清晰,例如創建新「空」對象所需的步驟與克隆現有對象所需的步驟完全不同。
相關問題