2009-09-24 74 views
0

我有3個接口類IVideo , IAudio , IGPIO和三個其他類將實現這些接口:Video_impl , Audio_impl , GPIO_impl抽象接口`ISingleton`爲基類

事情很簡單,至今。

但是,然後,我想要所有這些對象是單身人士。下面是問題:

抽象接口ISingleton是否是一個好主意,以便Video_impl , Audio_impl , GPIO_impl(或IVideo , IAudio , IGPIO?)可以從它繼承?

我正在考慮以下列方式實施它。是否推薦?我認爲必須有更好的方法。

//Isingleton.hpp 
template <class T> 
class ISingleton 
{ 
public: 
virtual T *getInstance() = 0; 

}; 

class IGPIO 
{ 
public: 
virtual int SelectAudioInput() = 0; 
}; 

class GPIO_impl : public IGPIO, public ISingleton<IGPIO> 
{ 
public: 
    IGPIO *getInstance(); 
    int SelectAudioInput() ; 
private: 
    IGPIO *instance; 
}; 
+0

看起來更像C++然後C#... –

+0

謝謝,Stefan.It是C++。 – pierrotlefou

回答

3

我會推薦閱讀Alexandrescu的「現代C++設計」。在其中,除了許多其他事情外,他還設計了一個完整的單身模板,並考慮了許多問題,例如應該何時銷燬它,是否應該在銷燬後復活,因爲在銷燬其他單例時需要它,和所有的好東西。

+0

事實上,一生的問題很棘手,不應低估,我喜歡鳳凰政策:) –

1

我在這裏沒有看到好處。您仍然必須在派生類中實現getInstance()方法。所以你已經介紹了模板和多重繼承,但並沒有真正獲得任何東西。我能看到的唯一小收穫就是讓你所有的單身份額成爲一種常見的方法,但這是一種常見的模式,我認爲這不是一個真正的收益。

1

你的單身人士不會工作。您不能使用虛擬方法來返回實例,因爲這隻能通過實例調用。您至少需要一個靜態方法或實現單例的中間對象。

如果你打算像這樣概括它,你應該閱讀C++中單例的實現。不過,我對所有庫代碼的建議是首先創建乾淨簡單的實現。在單例情況下,這可以簡單地將它實現爲沒有繼承的靜態方法。然後,只有當你已經實現了很多次,並且完全理解抽象實現的所有動機和細節時,你應該爲它創建一個庫。過早創建庫是錯誤和不可維護代碼的最大原因之一。