2011-07-28 4 views
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(); 
     } 
}; 

두 가지

  1. 나는 Prod_X에 special_variable을 소개했다. 이게 옳은 거니?
  2. 클래스 O는 기본적으로 Prod 클래스의 인터페이스를 사용하여 거의 모든 것을 수행합니다. 그러나이 특수 변수의 경우 O_derived_X는 변수를 올바르게 설정하는 데 관심이 있습니다.

내가 잘못 가고있는 곳을 제안 해 주시겠습니까? 또는 코드를 어떻게 리팩터링 할 수 있습니까? 이상적인 디자인에서

+2

'dynamic_cast'는 필요 없으며'static_cast' 만 사용할 수 있습니다. –

+0

하지만 static_cast (또한 dynamic_cast)는 정의되지 않은 동작을 발생시킬 수 없습니다 ({link [http://stackoverflow.com/questions/6322949/downcasting-using-the-static-cast-in-c}} 참조). – jmishra

+0

'p'의 동적 유형을 알고 있기 때문에 UB가 없습니다. 그리고 확실히 알기 때문에 dynamic_cast를 사용할 필요가 없습니다. static_cast는 여기에 친구입니다. – rodrigo

답변

1

, 공개적으로 상속 클래스는이 관계하고 "입니다"가 아닌 "의 연장이다"가 연장 될 수 있다는 점에서 관계 그러나 당신은 그것을 통지하지 않습니다 인터페이스 관점에서. 이것은 실제로 에 객체를 주문하면이되고 이되지 않습니다. 이 경우 팩토리는 필요한 것을 만들 수 있고 클라이언트는 실제 클래스 (다형성)를 알 필요가 없습니다.

항상 가능한 것은 아니기 때문에 캐스팅이 해결책 일 수 있지만이 경우에는 팩토리가 필요하지 않을 수도 있습니다 (O_derived_X가 Prod_X 객체 자체를 생성 할 수 있음).