C++ 存取器';设计
考虑到我有C++ 存取器';设计,c++,oop,design-patterns,C++,Oop,Design Patterns,考虑到我有 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 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;
};
其中,index
是块的索引,ACC\u ID\u x
是访问器接口ID
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;
IAccessor3* a3;
database->createAccessor( ACC_ID_3, index, (void**)&a3 );
为什么不将数据库对象和块索引作为构造函数参数传递给访问器呢
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 ();
解决方案应该是一个库实现。一些访问器将在此库中实现。我希望库用户可以扩展功能,并遵循库本身使用的相同机制。该库能够返回指向接口的指针,而不是类实例的指针。@Serge:这并不妨碍库的实现。该库可以提供多个从IAccessor派生的类供一般使用,用户可以从IAccessor派生自己的类供特定需要。如果不希望自定义IAccessor必须处理IDatabase和IChunk对象,可以将实际数据的访问器添加到IAccessor基类中。