在下面的例子中,使用隱式接口(情況2和3;模板)與使用顯式接口(情況1;指向抽象類的指針)有什麼優點/缺點?隱式與顯式接口
代碼不改變:
class CoolClass
{
public:
virtual void doSomethingCool() = 0;
virtual void worthless() = 0;
};
class CoolA : public CoolClass
{
public:
virtual void doSomethingCool()
{ /* Do cool stuff that an A would do */ }
virtual void worthless()
{ /* Worthless, but must be implemented */ }
};
class CoolB : public CoolClass
{
public:
virtual void doSomethingCool()
{ /* Do cool stuff that a B would do */ }
virtual void worthless()
{ /* Worthless, but must be implemented */ }
};
例1:一個非模板化類,它的基類的指針,其提供顯式的接口:
class CoolClassUser
{
public:
void useCoolClass(CoolClass * coolClass)
{ coolClass.doSomethingCool(); }
};
int main()
{
CoolClass * c1 = new CoolA;
CoolClass * c2 = new CoolB;
CoolClassUser user;
user.useCoolClass(c1);
user.useCoolClass(c2);
return 0;
}
情況2:甲模板類提供了一個隱式接口:
template <typename T>
class CoolClassUser
{
public:
void useCoolClass(T * coolClass)
{ coolClass->doSomethingCool(); }
};
int main()
{
CoolClass * c1 = new CoolA;
CoolClass * c2 = new CoolB;
CoolClassUser<CoolClass> user;
user.useCoolClass(c1);
user.useCoolClass(c2);
return 0;
}
情況3:一個模板類,其templ吃類型提供一個隱式接口(此時,從不導出CoolClass:
class RandomClass
{
public:
void doSomethingCool()
{ /* Do cool stuff that a RandomClass would do */ }
// I don't have to implement worthless()! Na na na na na!
};
template <typename T>
class CoolClassUser
{
public:
void useCoolClass(T * coolClass)
{ coolClass->doSomethingCool(); }
};
int main()
{
RandomClass * c1 = new RandomClass;
RandomClass * c2 = new RandomClass;
CoolClassUser<RandomClass> user;
user.useCoolClass(c1);
user.useCoolClass(c2);
return 0;
}
案例1要求對象在被傳遞給 useCoolClass()是CoolClass的子(和實施毫無價值( ))。另一方面,案例2和3將採取任何類具有 doSomethingCool()函數。
如果代碼的用戶總是細子類 CoolClass,那麼情況1具有直觀意義,因爲 CoolClassUser將總是期待一個 CoolClass的實現。但是,假設此代碼將成爲API框架的一部分,所以我無法預測用戶是否想要子類 CoolClass或者滾動具有 doSomethingCool()函數的自己的類。
一些相關的帖子:
https://stackoverflow.com/a/7264550/635125
https://stackoverflow.com/a/7264689/635125
https://stackoverflow.com/a/8009872/635125
您的案例1和案例2不會編譯。指針初始化的方式是錯誤的。 – Novelocrat 2012-02-10 19:39:35
@Novelocrat固定。 – 2012-02-10 21:18:57