2012-03-26 67 views
5

我正在爲應用程序創建記錄器。我正在使用第三方記錄器庫。在哪個記錄器被實現爲單例。正在擴展單例類錯誤嗎?

我擴展了記錄器類,因爲我想添加更多的靜態函數。在這些靜態函數中,我在內部使用Logger(我繼承)的實例(這是單個)。

我既沒有創建MyLogger的實例,也沒有重新實現超類的getInstance()方法。 但我仍然收到類似MyLogger析構函數的警告,因爲父類(Loggger)析構函數無法訪問而無法創建。我想知道, 我是否做錯了什麼? 繼承單例錯誤或應該避免?

回答

4

離開Singleton模式的優點一邊(有思想的一所學校,將其描述爲一個反模式),它不應該是必要它簡單地添加靜態功能。下面是我寧願子類單身特定語言的方法:

  • 使用一個獨立的功能封裝在一個C++的命名空間
  • 使用在C#
  • 在Java中使用一個輔助類的擴展類
  • 使用範疇在Objective-C
+0

我正在使用C++語言,我正在考慮創建一個只能從單例記錄器類繼承的靜態方法的包裝類。怎麼樣?? 你會詳細闡述一下你在C++中描述的方法嗎? 謝謝.. – EngineeredBrain 2012-03-26 18:03:01

+0

@AnwarShaikh這也適用 - 這是我在Java中所做的,因爲獨立函數在那裏不可用。我也會在C++中使用這條路線,但前提是我需要在我添加的函數中共享狀態或其他實現細節。 – dasblinkenlight 2012-03-26 18:05:23

+0

謝謝!我會通過編寫一個封裝來嘗試。 – EngineeredBrain 2012-03-26 18:20:13

0

我會在需要的地方使用非單例和委託調用單例。每當你有機會擺脫一個單身人士時,就去做吧。

+0

是的,確實需要避免使用singletons,但是當它用於Logger之類的東西時,結果很好。 如果我需要一些額外的方法以及那些單身人士,我該如何繼承它,或者在內部使用單身人士的單身人士身上編寫包裝(只有靜態方法的類)。 – EngineeredBrain 2012-03-26 18:36:35

+0

去一個包裝。這就是我所說的「代表呼叫」。 – 2012-03-26 19:06:06

0

我同意加勒特大廳,你應該避免辛格爾頓的,如果possbile。這就是說,我不認爲有一個原因是錯的。實施Singleton的人讓你擴展它。如果api開發人員不希望單身類Logger被擴展,那麼他們會使構造函數成爲私有的,例如C++,或者任何適用於您正在使用的語言的方法。

0

我覺得寫一個包裝過類是不正確的解決方案,因爲你需要編寫包裝器每次從單需要方法。最後你寫了幾十個函數。

此外,您還限制自己使用單身人士提供的所有功能。

不是一個好主意!