GUI 시스템을 구축하고 기본 "GUIcontrol"클래스에서 파생 된 여러 GUI 구성 요소에 대한 몇 가지 클래스가 있습니다. 필자가 원하는 것은 모든 유형의 구성 요소를 반환하지만 해당 구성 요소 유형 (파생 클래스의 함수)에 특정한 기능으로 작업 할 수 있어야한다는 것입니다. 다형성 접근법은 기본 클래스에서 객체를 생성하지 않기 때문에베이스에서 모든 파생 함수를 선언해야한다는 문제가 될 것임을 알았습니다.다형성에 대한보다 깨끗한 코드
class GUIcontrol {
protected:
std::string _name;
// these two methods (along with name()) will be used by all types
virtual void position(/*parameters*/)
virtual void useImage(/*parameters*/)
// these should be only in derived types
virtual void setHotSpot(/*parameters*/);
virtual void setScrollButtons(/*parameters*/);
public:
std::string name();
/*etc*/
}
class GUIbutton : public GUIcontrol {
public:
void setHotSpot(/*parameters*/);
}
class GUIscrollBar : public GUIcontrol {
public:
void setScrollButtons(/*parameters*/);
}
GUIcontrol* GUIsystem::getControl(std::string name);
이 문제는 내가 GUIbutton 또는 GUIscrollBar, 또는 기타 파생 GUI 클래스에 대한 모든 기능에 고유 한 기능을 더 추가하려는 경우, 나는 또한 기본 클래스에서 해당 가상 선언해야한다는 것입니다 컴파일러 아무튼 그래서 "setHotSpot"이 반환하는 기본 클래스의 멤버가 아닌 것과 같은 것에 불평하지 않습니다.
기본 클래스에는 모든 파생 클래스에 적용되는 멤버 함수가 있습니다 (예 : 위치를 지정해야하는 객체를 알려주는 것, 사용해야하는 이미지, 호출해야하는 것 등).하지만, 기본 클래스를 특정 파생 클래스에만 배타적으로 있어야하는 다른 함수로 채우고 싶습니다.
가상 함수를 계속 추가하면서 기본 클래스의 거대한 BLOB 객체로 끝납니다. 이것을보다 깨끗한 방법으로 설계 할 수 있습니까? static_cast/dynamic_cast를 사용하여 getControl()을 사용하여이 문제를 해결할 것인지 확실하지는 않지만이 문제를 해결할 수있는 다른 방법이 있는지 알고 싶습니다.
다형 기본 클래스의 전체 점은 모든 가능한 파생 클래스에 공통적 인 모든 기능을 포함해야합니다. 'setHotSpot()'이 모든 파생 클래스에 대해 이해가되지 않는다면, generic 함수는 어떻게 다형성 방식으로 그것을 사용할 수있게 될까요? 제네릭 함수가 할 수있는 일종의 구체적인 예를 들어 줄 필요가 있다고 생각합니다. –
더 큰 질문 인 IMO가 * 또 다른 * GUI 시스템을 만드는 이유는 무엇입니까? 이미 Qt, .NET, Java 또는 다른 많은 것들을 이미 재사용하지 않으시겠습니까? 나는 이것이 단지 학습을 위해서이기를 바랍니다. –
@Austin : .NET과 Java는 GUI 시스템이 아닙니다. (그리고이 플랫폼 용으로 작성된 GUI 라이브러리는 C++로 작업하는 사람에게별로 도움이되지 않습니다.) – jalf