Похоже ли это на ООП в Си? Похож ли такой способ построения приложений на ООП? И похоже ли это на наследование типа FileSocket от HsaSocket?#include
#include
#include
typedef void (*new_session)(void *ctx, const char *message);
/*
* low level
*/
typedef struct {
void *context;
int sock;
new_session new_ses;
} HsaSocket;
HsaSocket *hsa_socket_new(void)
{
HsaSocket *s = NULL;
s = (HsaSocket *)malloc(sizeof(HsaSocket));
return s;
}
/* session function setter */
static inline void hsa_socket_set_signal(HsaSocket *s, new_session ses)
{
s->new_ses = ses;
}
/* context setter */
static inline void hsa_socket_set_context(HsaSocket *s, void *ctx)
{
s->context = ctx;
}
void hsa_socket_start_server(HsaSocket *s)
{
if (s->new_ses != NULL)
s->new_ses(s->context, "server started");
}
void hsa_socket_send(HsaSocket *s, const char *data)
{
printf("%d %s", s->sock, data);
}
void hsa_socket_free(HsaSocket *s)
{
free(s);
}
/*
* Other abstraction level with new functional
*/
typedef struct {
HsaSocket *h_s;
} FileSocket;
FileSocket *file_socket_new(void) {
FileSocket *fs = NULL;
fs = (FileSocket *)malloc(sizeof(FileSocket));
fs->h_s = hsa_socket_new();
return fs;
}
void file_socket_send_file(FileSocket *fs, const char *fname)
{
//hsa_socket_send(fs->h_s, /*some data*/);
//hsa_socket_recv(fs->h_s, /*some data*/);
}
void file_socket_recv_file(FileSocket *fs, const char *fname)
{
//hsa_socket_recv(fs->h_s, /*some data*/);
//hsa_socket_send(fs->h_s, /*some data*/);
}
static inline void file_socket_start_server(FileSocket *fs)
{
hsa_socket_start_server(fs->h_s);
}
static inline void file_socket_set_signal(FileSocket *fs, new_session ses)
{
hsa_socket_set_signal(fs->h_s, ses);
}
static inline void file_socket_set_context(FileSocket *fs, void *ctx)
{
hsa_socket_set_context(fs->h_s, ctx);
}
static inline void file_socket_send(FileSocket *fs, const char *data)
{
hsa_socket_send(fs->h_s, data);
}
static inline void file_socket_free(FileSocket *fs) {
hsa_socket_free(fs->h_s);
free(fs);
}
/*
* Main App
*/
typedef struct {
FileSocket *fs;
//WebCam *cam;
//Compressor *cmp;
char ip[16];
unsigned port;
} App;
App *app_new(void)
{
App *app = NULL;
app = (App *)malloc(sizeof(App));
app->fs = file_socket_new();
return app;
}
/* Handler */
void app_on_new_session(App *app, const char *message)
{
printf("%s %s\n", message, app->ip);
}
static inline void _ses_sig(void *ctx, const char *message)
{
App *app = (App *)ctx;
app_on_new_session(app, message);
}
void app_start(App *app)
{
/* init */
file_socket_set_context(app->fs, (void *)app);
file_socket_set_signal(app->fs, _ses_sig);
/* start server */
file_socket_start_server(app->fs);
//file_socket_send(app->fs, /* some system information */);
//file_socket_send(app->fs, /* data about file */);
//file_socket_send_file(app->fs, "fsdfsd.dat");
}
void app_free(App *app)
{
file_socket_free(app->fs);
free(app);
}
int main(void)
{
App *app = app_new();
app_start(app);
app_free(app);
return 0;
}

21 Авг 2019 в 07:06
186 +1
0
Ответы
1

Да, данный код имеет элементы объектно-ориентированного программирования (ООП) в языке программирования C. В частности, созданы структуры HsaSocket и FileSocket, которые абстрагируют работу с сокетами и файлами соответственно. Также используется указатель на функцию new_session для установки функции обратного вызова при установлении нового соединения.

Кроме того, можно сказать, что данный подход похож на ООП, так как используется абстракция данных и функций, инкапсуляция и наследование (в определенной степени). Например, тип FileSocket "наследует" функционал от HsaSocket путем включения указателя на структуру HsaSocket в свою структуру.

Однако, в языке C нет поддержки наследования в строгом смысле, как в языках программирования с поддержкой классов и наследования, таких как C++ или Java. Здесь наследование реализуется простым включением одной структуры в другую.

Таким образом, хотя данный код использования объектно-ориентированных принципов, его реализация отличается от типичного ООП в языках с поддержкой классов и наследования.

20 Апр в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 588 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир