Как опыт обучения, я пытаюсь добиться простого наследования классов в C, среди других OOP функций.
До сих пор я был в состоянии правильно скрывать "частные" функции и атрибуты класса из внешнего контекста.
Давайте рассмотрим Point как простой пример класса. Он состоит из трех модулей:
publi c .h
#ifndef POINT_PUBLIC_H_
#define POINT_PUBLIC_H_
typedef struct Point Point;
Point* newPoint(const int x, const int y);
int getX(const Point* self);
int getY(const Point* self);
void setX(Point* self, const int x);
void setY(Point* self, const int y);
void printPoint(const Point* self);
#endif
Это в основном интерфейс Publi c для Point и он также определяет тип Point, ссылающийся на Структура, объявленная в другом модуле, скрывающая его атрибуты.
protected.h
#ifndef POINT_PROTECTED_H_
#define POINT_PROTECTED_H_
struct Point {
int x;
int y;
};
#endif
Она содержит фактическое определение структуры и может также содержать прототипы функций, которые должны быть доступны только посредством наследования классов. .
И еще есть реализация. c, которая включает в себя как publi c .h, так и protected.h и содержит фактический код publi c, защищенных и приватных функций.
Это прекрасно работает, но что, если я хотел определить класс Circle, который расширяет Point?
Я предполагал что-то вроде этого:
#ifndef CIRCLE_PROTECTED_H_
#define CIRCLE_PROTECTED_H_
#include "../Point/protected.h"
struct Circle {
Point parent;
int radius;
};
#endif
Поскольку ожидаемые функции Point 1010 * публикуются указатель на Point, и поскольку первый атрибут структуры Circle является Point (не указатель на него), для данного объекта Circle* c
становится возможным сделать что-то вроде getX((Point*) c);
. Хотя это работает нормально, меня не радует то, что я могу напрямую обращаться к атрибутам объекта Point (включая тот, что в структуре Circle, конечно) в модулях Circle. Перемещение определения структуры в модуль реализации сделало бы его атрибуты полностью закрытыми, но тогда я не смог бы напрямую определить объект Point, чтобы настроить механизм наследования. Есть ли способ заставить наследование работать при сохранении конфиденциальности расширяемого класса?