OOP Советы для детей с использованием различных структур - PullRequest
0 голосов
/ 22 января 2020

У меня есть модуль с родительским классом, который мы назовем Parent, и группа детей, которых мы назовем A, B, C. Все дочерние элементы должны иметь возможность отправлять данные в байтовом массиве, с той лишь разницей, что все они имеют различную структуру, которую они используют, и все реализуют свою собственную функцию для преобразования этой структуры данных в байтовый массив. Моя проблема в том, что я чувствую, что неправильно внедрил эту OOP систему, так как копирую и вставляю код и изменяю только одну вызываемую функцию, которую, я уверен, можно реализовать с помощью шаблонов, а также тот факт, что я чувствую, что родительский класс должен иметь функцию преобразования как чисто виртуальную функцию; однако, я не могу найти способ сделать это чисто. Я вставлю пример кода, похожего на тот, что у меня ниже:

class Parent
{
    virtual void fillTxBuf() = 0;
    void sendData()
    {
        //This fills txBuf with the data specific to the class
        this->fillTxBuf();
        send(txBuf);
    }
    uint8_t txBuf[20];
}

class A final: public Parent
{
    void fillTxBuf() override
    {
        this->transformStructToBytes(this->aDataStruct, this->txBuf);
        //Some other code that is the same in every "fillTxBuf" function
    }

    //I want this function to be an overrride as every child should implement this
    void transformStructToBytes(A_DATA, uint8_t*)
    {
        //Implementation goes here and is different for each child
    } 
    A_DATA aDataStruct;
}

class B final: public Parent
{
    void fillTxBuf() override
    {
        this->transformStructToBytes(this->bDataStruct, this->txBuf);
        //Some other code that is the same in every "fillTxBuf" function
    }

    //I want this function to be an overrride as every child should implement this
    void transformStructToBytes(B_DATA, uint8_t*)
    {
        //Implementation goes here and is different for each child
    } 
    B_DATA bDataStruct;
}

Как вы можете видеть, здесь много кода, который копируется и вставляется без необходимости (я думаю), и я был интересно, может ли кто-нибудь помочь мне устранить эту избыточность и, возможно, дать подсказки о том, как они это структурируют. Заранее спасибо за помощь, я просто пытаюсь улучшить свое программирование!

1 Ответ

1 голос
/ 22 января 2020

Вот как бы я это сделал:

class Parent
{
public:
    void sendData() const
    {
       std::vector<uint8_t> buf = getFlattenedBytes();
       send(buf);
    }

protected:
    // Should be implemented by each child class
    // to return a
    virtual std::vector<uint8_t> getFlattenedBytes() const = 0;
}

class A final : public Parent
{
protected:
    virtual std::vector<uint8_t> getFlattenedBytes() const override
    {
       std::vector<uint8_t> ret;
       // code to add flattened representation of aDataStruct
       // into (ret) would go here
       return ret;
    }

private:
    A_DATA aDataStruct;
};

[... and so on...]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...