開後門!
我們要建立一個class給別人用,假設我們有m_ID這屬性,但是是private成員,所以別人是無法存取這個屬性;有天,別人對你說我要使用這個屬性,請你做個GetID或SetID,不然乾脆點就變成public給我,但是如果你的class已經給了很多人使用,你變動了這些東西除了要compiler module一次,會很麻煩。
所以當初在設計的時候就可以做個後門讓別人使用:
class IInterface
{
// 使用此介面do something
// 這是我們要給別人用的class
};
class CCreator
{
private:
int m_ID; // 別人想要使用這個屬性
public:
friend class IInterface;
CCreator() { m_ID = 100; }
template<class> class PrivateAccessor; // 開個後門
};別人要存取m_ID的話,只要在他自己的class做這些事就可以:
class CUser : public IInterface
{
public:
CUser(CCreator &creator);
};
// 存取m_ID
template<>
class CCreator::PrivateAccessor<CUser>
{
public:
static int& ID(CCreator &creator)
{
return creator.m_ID;
}
};
typedef CCreator::PrivateAccessor<CUser> Accessor;
CUser::CUser(CCreator &creator)
{
Accessor::ID(creator) = 333; // 使用
std::cout << Accessor::ID(creator) << std::endl; // 取得
}
雖然說這樣就可以存取了,但是也會造成說你擺在private根本就沒用了,其實在設計期就應該要好好思考那些要開放那些不開放了,我是覺得這樣做會後患無窮就是....