나는 응용 프로그램 아키텍처에 다음과 같은 문제가 있으며 (많은 텍스트를 유감스럽게 생각합니다)을 해결하고자합니다.C++ 상속 질문
저는 게임 엔진 프로토 타입을 만들고 있는데 기본 추상 클래스가 있습니다 AbstractRenderer
(저는 C++ 구문을 사용 하겠지만 여전히 문제는 일반적입니다).
이 렌더러의 일부 구현이 있다고 가정 해 보겠습니다. DirectxRenderer
및 OpenglRenderer
을 예로 들어 보겠습니다. 이제
, 회원이이 시점에 모든 것을 분명히 을 촉구했다의이 렌더러의 하나 (의의 DirectX 기반에 충실하자) 가정 해 봅시다 것은 괜찮 - m_device
가 DirectxRenderer
에서 내부적으로 사용하고 노출되어서는 안된다 추상 AbstractRenderer
슈퍼 클래스.
일부 추상적 렌더링 인터페이스도 추가합니다 (예 : IRenderable
). 그것은 단순히 하나의 순수 가상 메서드에게 virtual void Render(AbstractRenderer* renderer) const = 0;
을 의미한다 그리고 이것은 몇 가지 문제가 시작하는 장소입니다. 제가 어떤 장면을 모델링한다고 가정하면,이 장면은 아마 어떤 기하학적 물체를 가지고있을 것입니다.
추상 수퍼 클래스 AbstractGeometricalObject
을 만들고 DirectX 기반 구현 DirectxGeometricalObject
을 생성했습니다. 두 번째 포인터는 DirectX 관련 버텍스 & 인덱스 버퍼에 대한 포인터를 저장합니다.
지금 - 문제. 그것은 논리적 인 측면에서 렌더링 가능한을 때문에
AbstractGeometricalObject
은 물론, IRenderable
인터페이스를 도출해야한다.
내가 내 DirectxGeometricalObject
AbstractGeometricalObject
에서, 첫 번째가 있어야한다 virtual void Render(AbstractRenderer* renderer) const { ... }
방법을 도출하고, 그 Abstract...
물건 몇 가지 문제를 제공합니다.
더 나은 설명은 코드를 참조하십시오 :
그리고 지금 내 클래스는 다음과 같은 방법으로 모양을 위해 : 나는 아마 너무 많이 걱정하고있어 알고
class AbstractGeometricalObject : public IRenderable {
virtual void Render(AbstractRenderer* renderer) const { ... }
};
class DirectxGeometricalObject : public AbstractGeometricalObject {
virtual void Render(AbstractRenderer* renderer) const {
// I think it's ok to assume that in 99/100 cases the renderer
// would be a valid DirectxRenderer object
// Assume that rendering a DirectxGeometricalObject requires
// the renderer to be a DirectxRenderer, but not an AbstractRenderer
// (it could utilize some DX-specific settings, class members, etc
// This means that I would have to ***downcast*** here and this seems really
// bad to me, because it means that this architecture sucks
renderer = dynamic_cast<DirectxRenderer*>(renderer);
// Use the DirectX capabilities, that's can't be taken out
// to the AbstractRenderer superclass
renderer.DirectxSpecificFoo(...);
}
,하지만 같은이 내리 뜬 간단한 사례는 응용 프로그램이 커지면 강제로 다운 캐스트를 많이 할 수 있음을 의미합니다. 분명히, 나는 이것을 피하고 싶습니다. 제발, 제게 조언을 좀 해주세요. 디자인상의 측면에서/제 실수를 지적 해주십시오.
는
문제는 내가 renderable (Render (AbstractRenderer * ...)와 Render (DirectxRenderer * ...)가 분리 된 렌더러를 가질 수 없기 때문에 여전히'Render' 메서드 인터페이스에만 국한되어있다. 행동 양식. 또는 나는 무엇인가 놓치 느냐? –
@ HardCoder1986 : Render() 호출 방법에 대한 예를 들어 주시겠습니까? 윌 당신은 이것을 가지고 : ** [DirectXGeometricalObject * dxgo = new ...; dxgo.Render (directx_renderer)] ** 컴파일러가 어떤 유형이 Render로 전달되는지 정확하게 알고 있다면 원하는대로 할 수있는 방법을 찾은 것 같습니다. –