2014-10-11 90 views
4

在Java中編寫程序時,如果我有一個特殊情況的對象需要通過主類區別對待,但不需要任何其他方法,是否更好將一個布爾參數添加到對象的構造函數(如isSpecial)中,並檢查該對象在主類中是特殊的還是創建一個擴展原始對象的新對象?擴展類與添加布爾參數

例如:

我有一個Cat類。如果一隻貓有鬍鬚,我想打印「這隻貓有鬍鬚!」在Main類中。

有一個WhiskerCat類或簡單地添加一個布爾參數給Cat構造函數如hasWhiskers會更好嗎?

回答

1

只需添加布爾參數。你不想結束大量類似的事情。例如,在Cat類中,hasWhiskers的默認值應該爲false,如果它們不調用明確要求它們指定它的構造函數,則保持false。然後你可以有一個hasWhiskers()方法返回這個布爾屬性。

通常,只有在新類具有附加功能(附加方法等)時才能擴展類,而這些附加功能不能簡單地添加到原始類中。

+0

只是想知道:比方說,你有貓類相關的4個布爾值。你會爲所有可能的參數組合使用16種不同的構造函數嗎?我的猜測是你只會寫出那些經常使用的。 – okarin 2014-10-11 04:40:22

+1

你可以選擇寫16層不同的構造函數(假設它是好的,爲你的類可以擁有任意數量由用戶設置的布爾值,並沒有由用戶設定的任何號碼),但通常你只會寫的組合構造函數只會經常使用。或者,對於這個問題,您可以有一個構造函數,它要求用戶指定所有內容,並且用戶可以爲所有布爾參數寫入'false'。 – ElvenAshwin 2014-10-11 04:53:44

1

這是一個責任問題:哪個班級在做什麼? 你的「主」類不應該意識到「貓」類的內部。

在你的情況下,這意味着可能需要調整Cat類的實現,以使主類可以使用新接口來打印該消息。

然後,Cat類本身可以有布爾,構成貓的(列表)組件,或者你可以繼承的方式。這很可能取決於真正的問題:還有更多的變化嗎?這真的是唯一的區別嗎?你正在上課/考試嗎? (在最後一種情況下,應用你所教的方式可能更有用)。

1

我覺得問題是關於設計模式而不是編碼風格

一般來說,如果你想在一個類中添加一些新的功能。

首先,你應該問自己它是一個接口還是屬性?如果它是一個屬性,那麼有兩種方法來解決它。

方法1:你所提及般

方式二:你應該使用委託(即添加hairclass考慮是否是一個長頭髮的貓 或者是短頭髮的貓。)

1

只是想知道,是添加一個布爾值唯一的方法來識別對象是否特殊?肯定還有一些其他的特性使它變得特別嗎?

無論如何,知道它是不是主要職責的責任。留下應該打印到Cat類而不是Main類的內容。

1

在我看來,這取決於特性的特殊性。

如果我們考慮另一個例子:

汽車...
屬性「天窗」或「導航」是相當普遍,有車無特殊要求,可以是基礎類的一部分。 但是,警笛和閃光燈是非常罕見的,如果它們是另一個擴展類的屬性,它會更適合。