2
나는 dynamic_cast를 피하고 싶지만 여전히 느슨한 결합을 얻는 방법을 알고 싶어하는 디자인 기반 질문을 가지고 있습니다. 이 Prod_X의 속성이고 일반적으로 프로덕션으로 때문이서브 클래스 고유의 액세스 팩토리 패턴
class Prod { // Prod has lot of subclasses
public:
void method()
{//Some Implementation
}
};
class Prod_X : Prod
{
int special_variable;
public:
void method()
{//Override Base
}
void setSpecialVariable()
{//Set Special Variable
}
};
class Factory
{
public:
Prod* create(string &s)
{ if (s == "X") return new Prod_X; //And so on
};
};
class O
{
public:
Factory F; // Assume we are talking about a simple factory pattern
Prod* create(string &s)
{ p = F.create(s); return p;}
Prod* p;
};
// Issue is here on coupling and how to avoid dynamic_cast
// Inherited Prod member for O_derived_X is always Prod_X (Factory takes care of that)
class O_derived_X {
int special_variable;
public:
void setSpecialVariable()
{ // Need to set Prod_X Variable
Prod_X *px = dynamic_cast<Prod_X*>(p);
px->setSpecialVariable();
}
};
두 가지
- 나는 Prod_X에 special_variable을 소개했다. 이게 옳은 거니?
- 클래스 O는 기본적으로 Prod 클래스의 인터페이스를 사용하여 거의 모든 것을 수행합니다. 그러나이 특수 변수의 경우 O_derived_X는 변수를 올바르게 설정하는 데 관심이 있습니다.
내가 잘못 가고있는 곳을 제안 해 주시겠습니까? 또는 코드를 어떻게 리팩터링 할 수 있습니까? 이상적인 디자인에서
'dynamic_cast'는 필요 없으며'static_cast' 만 사용할 수 있습니다. –
하지만 static_cast (또한 dynamic_cast)는 정의되지 않은 동작을 발생시킬 수 없습니다 ({link [http://stackoverflow.com/questions/6322949/downcasting-using-the-static-cast-in-c}} 참조). – jmishra
'p'의 동적 유형을 알고 있기 때문에 UB가 없습니다. 그리고 확실히 알기 때문에 dynamic_cast를 사용할 필요가 없습니다. static_cast는 여기에 친구입니다. – rodrigo