Конечно, можно делать объектно-ориентированное программирование на C. Помните, что, например. первый компилятор C++ на самом деле был транспилером C++ в C, виртуальная машина Python написана на C и т. д. Что отличает так называемые языки ООП от других, так это лучшая поддержка этих конструкций, например, в синтаксисе.
Одним из распространенных способов обеспечения абстракции являются указатели на функции. Посмотрите на структуру исходного кода ядра Linux ниже (из 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. См. эту статью, чтобы узнать больше об этом конкретном примере.
Другой формой абстракции данных являются непрозрачные указатели. Непрозрачный тип данных объявляется в заголовочном файле, но определение никогда не раскрывается. Код, который не знает определения типа, никогда не сможет получить доступ к его значению, а только использовать указатели на него. См. Непрозрачный тип данных и Непрозрачный указатель в Википедии.
Примером непрозрачного типа данных, с которым вы, вероятно, сталкивались, является FILE
из stdio.h. Один и тот же интерфейс используется во всех операционных системах, хотя фактические данные, на которые указывает FILE *
, различаются. Вы можете получить FILE *
, вызвав fopen
, и манипулировать им с помощью ряда других вызовов функций, но вы можете не видеть данные, на которые он указывает.
Чтобы узнать больше об объектно-ориентированном программировании на C, я рекомендую бесплатную онлайн-книгу Object Oriented Programming. в ANSI-C. Ознакомьтесь с этой статьей доктора Доббса. Связанные вопросы: Ориентация объекта в C и Можете ли вы писать объектно-ориентированный код на C?.
person
jacwah
schedule
22.07.2015