Конвертировать иерархию C ++ OO в C процедурный - PullRequest
2 голосов
/ 12 марта 2020

Я использовал C некоторое время, но иногда, когда я думаю о том, как решить проблему, я не могу думать ни о каком другом пути, кроме как ооо, как меня учили в школе. И поскольку я использовал C, я в основном использовал шаблоны OO, но в C иногда боролся с языком, чтобы он работал. К go с простым примером: если мне нужно написать абстракцию ресурса файловой системы, я подумаю о написании базового класса Resource, который будет наследоваться, например, классом ImageFile и классом AudioFile.

class Resource {
    bool opened;
    virtual bool load_file(const char *fpath);
    virtual bool release(void);
}

class ImageFile : Resource {
    bool load_file(const char *fpath) { ... }
    bool release(const char *fpath) { ... }
}

class AudioFile : Resource {
    bool load_file(const char *fpath) { ... }
    bool release(const char *fpath) { ... }
}

int main() {
    Resource img = ImageFile();
    Resource mus = AudioFile();

    img.load_file("my_image.png");
    mus.load_file("song.mp3");

    img.release();
    mus.release();

    return 0;
}

В C я повторяю это поведение, используя указатели функций. Дело в том, что это все еще ОО дизайн, и я хочу научиться мыслить процедурно. Как бы вы go разработали эту же проблему процедурным способом? Как наследование ОО переводится в процедурный? Как вы думаете, процедурный?

1 Ответ

0 голосов
/ 12 марта 2020

Ваша идея, ведущая к указателям на функции, определенно является правильным путем к go.

Идея состоит в том, что у нас есть указатели на функцию "родительского" класса, дочерний класс несет указатель на эту родительскую структуру и когда мы определяем наше собственное определение функций, мы можем указать эти функции на наши реализованные.

Я приведу простой пример того, как этого можно достичь.

struct resource {
    bool (*load_file)(const char *fpath);
    bool (*release)(const char *fpath)
};

struct imageFile {
    struct resource *ops;
};

struct audioFile {
    struct resource *ops;
};

bool image_load_file(const char *fpath) {...}
bool image_release(const char *fpath) {...}

bool audio_load_file(const char *fpath) {...}
bool audio_release(const char *fpath) {...}

int main () {
    static const struct op1 = {
        image_load_file,
        image_release,
    };

    static const struct op2 = {
        audio_load_file,
        audio_release,
    };

    // Assigning the functon pointers

    struct imageFile *im = malloc(sizeof(*im));
    im->ops = op1;

    struct audioFile *aud = malloc(sizeof(*aud));
    aud->ops = op2;

    // Calling the functions
    im->ops->load_file(fpath);
    im->ops->release(fpath);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...