У меня есть структура данных, к которой я хочу обращаться / изменять по-разному в разных ситуациях. Я придумал это:
class DataStructure
{
public:
int getType();
private:
// underlying data containers
};
class WrapperBase
{
public:
void wrap(DataStructure *input)
{dataStructure = input;}
protected:
DataStructure *dataStructure;
};
class WrapperOne : public WrapperBase
{
public:
// @Mykola: I know bytes 4-10 in an array of type one specify the date
// so this method will format those bytes and return them
Data getDate()
};
class WrapperTwo : public WrapperBase
{
public:
// @Mykola: There is mostly just a chunk of data in packet type two. So this
// method will turn 4 bytes into an int at position index and return that
int dataAt(int index);
};
Одна проблема, которую я вижу здесь, заключается в том, что WrapperBase не является абстрактным, даже если так и должно быть. Конечно, я мог бы добавить в конструктор некоторую чисто виртуальную фиктивную функцию или assert (0), но это кажется слишком хакерским решением. Или я должен полностью избавиться от наследования, поскольку оно действительно сделано только для повторного использования кода? Любые другие проблемы с этим решением?
Или я совсем не на том пути?
Edit @ Paul
Почему я хочу это сделать? Ну, я получил несколько 1000 массивов сериализованных данных, которые я хочу добавить в набор данных. Первые несколько байтов каждого массива говорят мне, что это за данные, что определяет, как я их обработал. Итак, я делаю что-то вроде:
// some place in the program
dataSet.processData(dataStructure);
// in the data set class
DataSet::processData(DataStructure *dataStructure)
{
if(dataStructure->getType() == TYPE_ONE)
{
WrapperOne wrapperOne;
wrapperOne.wrap(dataStructure);
processDataTypeOne(wrapperOne);
}
// repeat the above for other data types
}
Конечно, я мог бы поместить всю логику в функцию processDataTypeOne
, и это было то, чем я занимался в начале, но работа с необработанной структурой данных превратилась в ужасный беспорядок операций с индексами. Вот почему я хотел бы обернуть его в объект, который скроет все это.