2017-04-09 2 views
0

C++에서 dynamic_cast는 사용하는 나쁜 디자인과는 5 점 만점에 5 개 파생 클래스는 내가 클래스 CAbstractNode이

을 가지고, (특수)는 메서드 SetValue()와 멤버 INT nVal 필요 단지 2;

또는 염기 가상로서

난의 setValue를 취한다() 메소드 (CAbstractNode) 를 위와 같이 2 용구

//myFunction is virtual function of base(cAbstractNode) implemented in 2 special derived classes 
myFunction(CAbstractNode * obj, int val) 
{ 
    Derived_02 nodeObj = dynamic_cast<Derived_02*>(obj); 

    if(res != NULL) 
    { 
     nodeObj->setValue(val); 
    } 

    //remaining code goes here... 
} 


//myFunction is virtual function implemented in remaining 3 derived classes (setValue() is not needed here) 
myFunction(CAbstractNode * obj, int val) 
{ 

    //remaining code goes here... 
} 

는 I 2 개 파생 클래스 동적 캐스트로 이동한다 파생 클래스 및이 메서드는 다른 3 파생 된 클래스에서 비어 유지?

+1

가상 함수를 사용하기 위해'dynamic_cast'를 피해야합니다. –

+1

예, 유형을 켜기 위해 동적 형 변환을 사용하면 좋지 않습니다. –

+0

'std :: variant'를 가능한 대체물로 추가하고 싶습니다. 이 기능이 항상 클래스 내에 포함되는 것은 아닙니다. – chris

답변

0

dynamic_cast 보통이 함수의 과부하 또는 가상 함수를 사용하여 해결 될 수 code smell

이다.

+0

유형 검사를 피하기 위해 가상 메소드를 만드는 심층 계층에서는 기본 클래스의 SRP를 위반하게됩니다. SRP가 완벽하게 따라야한다는 것을 의미하지는 않습니다. 단지 기본 클래스가 수십 개의 관련없는 메소드를 포함한다는 것을 의미합니다. –

2

문제가 자체는 dynamic_cast 아니므로 증상입니다. 귀하의 경우에 myFunctionCAbstractNode 인터페이스를 수락하면이 인터페이스가 작동합니다. 그러나 어떤 이유로 든 Derived_02에 대해 알고 있어야하며 그에 대한 구체적인 방법을 호출해야합니다. 이는 대부분 CAbstractNode 인터페이스가 제대로 설계되지 않았 음을 보여줍니다. 또는 적어도 적절하게 설계되지는 않았지만 인터페이스를 수정하거나 해결 방법을 유지할 것인지 결정하는 것은 사용자가 결정합니다. 엔지니어링은 대부분 타협에 관한 것이고 완벽한 디자인은 실제로 도달 할 수 없거나 실용적이지 않다는 것을 기억하십시오.