2010-06-18 2 views
0

나중에 확장을 위해 소스의 일부를 추상화하는 인터페이스를 만들었습니다. 그러나 특별한 방법으로 파생 클래스를 확장하려면 어떻게해야합니까?인터페이스에 의해 파생 된 구체적인 클래스의 메서드 풀을 확장합니다.

class concreteFoo : public virtualFoo 
{ 
public: 
concreteFoo() { } 
~concreteFoo() { } 

virtual void create() { } 
virtual void initialize() { } 

void ownMethod() { } 
}; 

그래서 내가 concreteFoo의 인스턴스를 생성하고이 같은 ownMethod를 호출하려고 시도 :

별도의 방법으로

class virtualFoo 
{ 
public: 
virtual ~virtualFoo() { } 

virtual void create() = 0; 
virtual void initialize() = 0; 
}; 

한 파생 클래스 : 그래서 나는 여기에 인터페이스가

void main() 
{ 
virtualFoo* ptr = new concreteFoo(); 
concreteFoo* ptr2 = dynamic_cast<concreteFoo*>(ptr); 

if(NULL != ptr2) 
    ptr2->ownMethod(); 
} 

작동하지만 실제로는 우아한 방법은 아닙니다. ptr->ownMethod();을 직접 사용하려고하면이 메서드가 virtualFoo의 일부가 아니라는 컴파일러가 불평합니다. dynamic_cast을 사용하지 않고이 작업을 수행 할 수 있습니까?

미리 감사드립니다.

답변

1

이것은 정확히 dynamic_cast을위한 것입니다. 그러나 일반적으로 디자인을 변경하여 사용하지 않아도됩니다. 당신이 추상적 인 예를 든 이후로, 당신이 일을 다르게해야하는지 판단하기가 어렵습니다.

+0

감사합니다. 내 실제 인터페이스는 마우스 또는 키보드와 같은 입력 장치를 추상화하기위한 것입니다. 아이디어는 buttonDown() 또는 buttonUp()과 같이 두 장치에서 모두 사용되는 메서드를 추상화하는 인터페이스를 만드는 것입니다. 특정 장치에 대해서만 의미가있는 메서드는 인터페이스가 아닌 파생 클래스에만 있습니다. 따라서 키보드에는 인터페이스가 없어야하는 고유 한 getPosX()가 있습니다. 키보드와 같은 장치는 절대로 필요하지 않습니다. 그래서 나는 인터페이스에 이것을 가지고 싶지 않습니다 - 또한 입력 장치의 일부가 아닌 메서드 호출을 피하기 위해서입니다. – CelGene

+0

'dynamic_cast'는 기본 클래스 포인터를 컨테이너에 저장하고자 할 때 가장 유용합니다. 또 다른 공통적 인 용도는 라이브러리/API와의 인터페이스입니다.이 API를 사용하면 구조 중 하나에 자체 데이터 일부를 저장할 수 있습니다 (예 : Windows 프로그래밍의 cbWndExtra). 하지만 대부분의 경우, 기본 클래스 포인터/참조를 사용하여 작성한 코드는 파생 클래스 별 인터페이스로는 아무 것도 할 필요가 없습니다. – Cogwheel

관련 문제