2013-10-06 2 views
3

Я понял, что абстракция данных скрывает технические детали от пользователя и показывает только необходимые детали. Таким образом, абстракция данных является функцией ООП. Мой вопрос: C также поддерживает абстракцию данных?Абстракция данных в C

Если да, то почему абстракция данных является объектно-ориентированным языком программирования, а не процедурной языковой функцией?

Если ответ на мой вопрос: нет, то что относительно структур, перечислений в C? Они также скрывают детали от пользователей.

+0

«Почему абстракция данных носит объектно-ориентированный язык программирования, а не функция процедурного языка?» - Это не тот случай. –

+0

Тогда почему это упоминается везде как функция ООП, а не процедурная языковая особенность? – mrutyunjay

+1

Вы заключаете, что все мужчины - кошки, но это не тот случай. Абстракция данных является желательной вещью. ООП - это стиль программирования, который обеспечивает абстракцию данных. Вы можете добиться абстракции данных разными способами. –

ответ

1

Скрытие легко на C, только вопрос литых.

OOP может быть сделано, но я бы сказал, что некоторая функция не очень удобна для получения (например: наследование). Я думаю, что полиморфизм, возможно, даже достигнут, но никогда не пробовал дома!

C интерфейсы к родным C++ библиотеки являются общими, что-то вроде:

void *obj_create(void); /* return obscure ptr */ 
int obj_method(void *obj, int somearg); 
void obj_destroy(void *obj); 

отделяющего приватных заголовков от общественности распределенной и т.

редактировать

В AmigaOS есть базовая реализация ООП C, которая работает от лет, до сих пор используется от AROS проекта, по крайней мере, реализация называется BOOPSI, а также является основой для некоторых гаджет GUI (виджет), но может быть использован для описания объектов , здесь небольшой introduction (В справочном руководстве Amiga Rom Kernel показано, как использовать его для трансляции сигнала на большее количество объектов, слотов пионера Qt/сигналов).

В прошлые дни я изучал Nim lang, он сгенерировал код C (добавьте некоторое время выполнения, которое может быть disabled) для компиляции с такими бэкэндами, как gcc/clang/tinycc, и поддерживает несколько ООП.

+1

Еще одна очевидная форма скрытия данных - это объявление структуры с ключевым словом extern в заголовке, но затем определение этого строя в модуле. Только функции в этом модуле знают структуру структуры, но функции в других модулях могут по-прежнему использовать копию этой структуры. –

4

Конечно, можно сделать объектно-ориентированное программирование в 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?.