Конечно, можно сделать объектно-ориентированное программирование в C. Помните, что, например, first C++ compiler был фактически транспилером C++-C, Python VM написан на C и т. д. Вещь, которая устанавливает так называемые языки OOP, отличные от других, лучше поддерживает эти конструкции, например, в синтаксисе.
Одним из распространенных способов обеспечения абстракции являются указатели на функции. Посмотрите на структуру из источника ядра Linux ниже (from include/linux/virtio.h).
/**
* virtio_driver - operations for a virtio I/O driver
* @driver: underlying device driver (populate name and owner).
* @id_table: the ids serviced by this driver.
* @feature_table: an array of feature numbers supported by this driver.
* @feature_table_size: number of entries in the feature table array.
* @probe: the function to call when a device is found. Returns 0 or -errno.
* @remove: the function to call when a device is removed.
* @config_changed: optional function to call when the device configuration
* changes; may be called in interrupt context.
*/
struct virtio_driver {
struct device_driver driver;
const struct virtio_device_id *id_table;
const unsigned int *feature_table;
unsigned int feature_table_size;
int (*probe)(struct virtio_device *dev);
void (*scan)(struct virtio_device *dev);
void (*remove)(struct virtio_device *dev);
void (*config_changed)(struct virtio_device *dev);
#ifdef CONFIG_PM
int (*freeze)(struct virtio_device *dev);
int (*restore)(struct virtio_device *dev);
#endif
};
probe
, scan
, remove
и так далее все указатели на функции, что драйвер ввода/вывода сами наборы. Затем ядро может вызывать эти функции для любого драйвера ввода-вывода без необходимости знать что-либо об устройстве. Это пример абстракции в C. См. this article, чтобы узнать больше об этом конкретном примере.
Другая форма абстракции данных - непрозрачные указатели. В заголовочном файле объявляется непрозрачный тип данных, но определение никогда не отображается. Код, который не знает определения типа, никогда не может получить доступ к его значению, используйте только указатели на него.См. Opaque data type и Opaque pointer в Википедии.
Примером непрозрачного типа данных, с которым вы, вероятно, сталкивались, является FILE
от stdio.h. Тот же интерфейс используется во всех операционных системах, хотя фактические данные, на которые указывает FILE *
, отличаются. Вы можете получить FILE *
, позвонив по номеру fopen
и манипулируя им множеством других вызовов функций, но вы можете не видеть данные, на которые он указывает.
Чтобы узнать больше об объектно-ориентированном программировании на C, я рекомендую бесплатную онлайн-книгу Object Oriented Programming in ANSI-C. Отметьте статью this Dr Dobbs. Связанные вопросы: Object orientation in C и Can you write object oriented code in C?.
«Почему абстракция данных носит объектно-ориентированный язык программирования, а не функция процедурного языка?» - Это не тот случай. –
Тогда почему это упоминается везде как функция ООП, а не процедурная языковая особенность? – mrutyunjay
Вы заключаете, что все мужчины - кошки, но это не тот случай. Абстракция данных является желательной вещью. ООП - это стиль программирования, который обеспечивает абстракцию данных. Вы можете добиться абстракции данных разными способами. –