다음 예제에서 명시 적 인터페이스 (사례 1, 추상 클래스의 포인터)를 사용하는 암시 적 인터페이스 (사례 2 및 3; 템플릿) 사용의 장단점은 무엇입니까? 변경되지 않습니다암시 적 대 명시적인 인터페이스
코드 :
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 : 명시 적 인터페이스를 제공하는 기본 클래스 포인터를 취 비 템플릿 A 급 템플릿 유형이 암시 적 인터페이스를 제공하는 템플릿 유형의 클래스 :
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 : 템플릿이있는 템플릿 기반 클래스
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의 자식 (그리고 쓸모없는 을 구현 (: 식사 유형은하지 CoolClass에서 파생 암시 적 인터페이스 (이 시간을 제공합니다)). 반면에 케이스 2와 3은 클래스를 취합니다.이 클래스에는 doSomethingCool() 함수가 있습니다. 코드의 사용자가 CoolClass 항상 좋은 서브 클래스 했다 경우 CoolClassUser 항상 CoolClass의 구현을 기대 될 수 있기 때문에
후 케이스 1, 직관적 인 의미가 있습니다. 그러나이 코드는 API 프레임 워크의 일부로 가정하므로 사용자가 CoolClass의 하위 클래스를 만들 것인지 아니면 doSomethingCool() 함수가있는 자체 클래스를 롤링할지 예측할 수 없습니다.
일부 관련 게시물 :
https://stackoverflow.com/a/7264550/635125
https://stackoverflow.com/a/7264689/635125
https://stackoverflow.com/a/8009872/635125
사례 1과 사례 2가 컴파일되지 않습니다. 포인터 초기화가 잘못되었습니다. – Novelocrat
@Novelocrat가 수정되었습니다. –