class IInterface {
public:
virutal void doSomething1() = 0;
virtual void doSomething2() = 0;
};
class A : public IInterface {
public:
void doSomething1() override;
void doSomething2() override;
};
class B : public IInterface {
public:
void doSomething1() override;
void doSomething2() override;
};
이렇게 있는데, 지 혼자 쓰는 동작을 가진 애가 있어,
class C : public IInterface {
public:
void doSomething1() override;
void doSomething2() override;
void doSpecialThing();
};
사용하는 쪽에서는 IInterface를 가지고 사용한단 말야,
IInterface* pObject = new A();
pObject->doSomething1();
근데 C의 doSpecialThing()을 사용하려면 IInterface에 그 함수가 있어야지 사용하는 쪽에서 쓸 수 있을거 아냐
그래서
class IInterface {
public:
virtual void doSomething1() = 0;
virtual void doSomething2() = 0;
virtual void doSpecialThing() {}
};
이런 식으로 바꾸고 class C만 저걸 구현해서 쓰고 있는데,
A, B는 가지지 않은 동작인데 A,B,C의 interface에 저게 들어가 있는게 아닌거 같고,
그렇다고 저 동작을 분리해서 따로 인터페이스를 만들자니 저런 동작이 너무 많기도 하고, 생성은 또 어떻게 하나 싶기도 하고.
이런거 해결하는 깔끔한 방법 있음??
아니면 구글 키워드라도
인터페이스를 하나 더 만들어서 그걸 IInterface 가 상속하게 하는 방법이 있고 (비추), C 의 원래 포인터를 갖고 있다가 interface 로 캐스팅한걸 쓰다가 필요할 때 저걸 쓰면 됨. 아니면 Interface 가지고 지랄하지 말고 CRTP 로 정적 다형성 하는 방법이 있다 (강추) - return 0;
A,B,C가 있는 부분과 그걸 사용하는 부분이 분리되어있는데, C를 직접 쓰라는건 분리된걸 다시 붙여버리는거잖어.
template 써서 하는건 생각해봤는데, 그 뭐냐, 인터페이스가지고 하는게 아니라 doSpecialThing()을 구현한 놈이면 다 인자로 받을 수 있게 하는거, 근데 내가 지금 외부 파일에서 입력받아서 A인지, B인지, C인지 선택하도록 하고 있단말야. 템플릿 쓰면 동적으로 그런거 안되잖아
파일 종류 보고 일치하는 타입을 dispatch 해주는 프로시저에서 구분해주도록 해도 되긴 한데 - return 0;