鉴于我有
class IChunk
{
public:
const char* getRawData() = 0;
...
};
class Chunk
{
public:
const char* getRawData();
...
private:
char* data;
};
class IDatabase
{
public:
IChunk* getChunk( int index ) = 0;
...
};
class Database : public IDatabase
{
public:
IChunk* getChunk( int index );
...
private:
std::vector< Chunk > m_chunks;
};
我想用getRawData()
以不同的方式解释IChunk
返回的原始数据。访问者使用IDatabase
和IDatabase
接口。
创建访问者的最佳位置是什么?
使用这样的创建函数扩展IAccessor* a = database->createAccessor( ACC_ID_1, index );
IAccessor1* a1 = dynamic_cast< IAccessor1* >a;
IAccessor* a = database->createAccessor( ACC_ID_2, index );
IAccessor1* a2 = dynamic_cast< IAccessor2* >a;
接口是否正确:
index
其中ACC_ID_x
是块索引,IAccessor3* a3;
database->createAccessor( ACC_ID_3, index, (void**)&a3 );
是访问者接口ID。
在这种情况下需要动态演员,这可能不安全且设计不是很好。我能改进吗?
我应该考虑使用哪种设计模式来实现访问者的工厂?我的目的是允许动态添加访问者(和相应的访问者ID)。
通过以下方式实现访问者创建是否可以:
{{1}}
答案 0 :(得分:1)
为什么不将数据库对象和块索引作为构造函数参数传递给访问器?
class IAccessor
{
protected:
IAccessor (IDatabase *database, int index) : m_database (database), m_index (index) {}
IDatabase *m_database;
int m_index;
};
class Accessor1 : public IAccessor
{
public:
Accessor1 (IDatabase *database, int index) : IAccessor (database, index) {}
};
然后:
Accessor1 a1 (database, index);
some_value = a1.SomeFunction ();