작은 3D 엔진을 재구성하려고합니다. 매우 작기 때문에 한 파일에만 모든 파일을 배치합니다. 지금, 나는 다른 프로젝트에 다른 모듈을 분산시키고 dll로 빌드 할 수 있도록 인터페이스로 재구성하려고합니다. 프레임 워크 코드의 기본 설계에 많은 어려움을 겪었습니다. 작은 엔진의 'Object Hierarchy'를 디자인하고 싶습니다. 이전 작업에서 실현되었습니다. 예 :C++ 인터페이스 (순수 가상 클래스)/다중 상속/가상 상속에 관한 디자인 qustion
Object
Component
SceneComponent
StaticMeshComponent/SkelMeshComponent
D3DSkelComponent
...
그러나 직접 구현됩니다. 지금, 내가, 내가 (테스트) 기본 인터페이스를 설계해야 인터페이스 (순수 가상 클래스)를 사용하려면 : 내가 그들을 구현하려고 할 때
#include <cstdio>
#include <iostream>
#include <string>
using namespace std;
class IObject
{
public:
virtual std::string GetName() = 0;
};
class IMesh : public IObject
{
public:
virtual void Draw() = 0;
};
class IStaticMesh : public IMesh
{
public:
virtual void BuildSomeMesh() = 0;
};
class ISkeletalMesh : public IMesh
{
public:
virtual void PlayAnim(const std::string& strAnimName) = 0;
};
class ID3DSkeletalMesh : public ISkeletalMesh
{
public:
virtual void LoadD3D(const std::string& strD3D) = 0;
};
가 좋아처럼 보이지만, 나는이 사실을 발견했습니다 불가능한 사명이 되어라. 첫째, 내가 IObject의 템플릿 클래스 또는 일반 클래스, 예를 들어 작성할 수 있습니다
template < typename TBase >
class TObject : public TBase
{
public:
virtual std::string GetName()
{
return m_strTest;
}
std::string m_strTest;
};
이 TObject의에 기반을, 나는 CMesh을 구현할 수 있습니다
class CMesh : public TObject<IMesh>
{
public:
virtual void Draw()
{
cout<<"draw mesh" <<endl;
}
};
IMesh* pMesh = new CMesh(); // ok
IObject* pObj = pMesh; // ok
지금까지, 그것은 잘 작동합니다. 그러나 CStaticMesh/CSkeletalMesh/CD3DSkeletalMesh를 구현하는 방법은 무엇입니까? 어쩌면이 같은 을 :
class CStaticMesh : public CMesh, public IStaticMesh
{
public:
};
하지만 난이 개 IObject 기본 클래스, 그래서 내가 "가상 공공 XXX"에, 나쁜 보이는 모든 "공공 XXX"를 변경해야합니다. 또 다른 질문은, CStaticMesh이 IStaticMesh의 모든 가상 멤버 함수를 구현해야합니다입니다은 다음과 같습니다 CStaticMesh의 기본 통화입니다 CMesh에 그리기가
virtual void Draw() = 0;
virtual void BuildSomeMesh() = 0;
경우에도 마찬가지입니다. 좋아, 어쩌면 나는 TMesh 필요
template < typename TBase >
class TMesh : public TObject<TBase>
{
public:
virtual void Draw()
{
cout<<"draw mesh" <<endl;
}
};
과 같은 CStaticMesh을 구현 :
이 좋아 보이는class CStaticMesh : public TMesh<IStaticMesh>
{
public:
virtual void BuildSomeMesh()
{
cout<<"Build Some Mesh!"<<endl;
}
};
,하지만 어떻게 CD3DSkeletalMesh을 implment하기 위해? TSkeletalMesh를 만드시겠습니까? ok, 그것은 미쳤다! !!
나는 이것이 생각합니다. 이 디자인의 실수입니까? 이 딜레마를 피하기 위해 디자인 아이디어를 어떻게 바꿀 것인가? 인터페이스의 상속 계층 구조를 유지하고 쉽게 구현할 수있는 아이디어를 알고 계십니까? 가상 상속을 많이 사용하는 경우 성능이 좋지 않습니까?