簡體   English   中英

C中的數據抽象

[英]Data Abstraction in C

我對數據抽象的理解是隱藏用戶的技術細節並僅顯示必要的細節。 因此,數據抽象是一種OOP功能。 我的問題是:C是否也支持數據抽象?

如果是這樣,為什么數據抽象是面向對象的編程語言特性而不是過程語言特性?

如果我的問題的答案是否定的 ,那么C中的結構,枚舉呢? 他們還隱藏了用戶的詳細信息。

在C語言中進行面向對象編程當然是可能的。請記住,例如, 第一個C ++編譯器實際上是C ++到C的轉換器,Python VM是用C語言編寫的。將所謂的OOP語言與其他語言區別開來的東西是更好的支持這些結構,例如在語法中。

提供抽象的一種常見方法是函數指針。 查看下面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
};

probescanremove etcetera都是I / O驅動程序自行設置的函數指針。 然后,內核可以為任何I / O驅動程序調用這些函數,而無需了解有關該設備的任何信息。 這是C中的抽象示例。請參閱此文章以閱讀有關此特定示例的更多信息。

另一種形式的數據抽象是不透明的指針。 在頭文件中聲明了不透明數據類型,但從不公開該定義。 不知道類型定義的代碼永遠不能訪問它的值,只使用它的指針。 請參閱Wikipedia上的不透明數據類型不透明指針

您可能遇到的不透明數據類型的示例是stdio.h中的FILE 雖然FILE *指向的實際數據不同,但所有操作系統都使用相同的接口。 您可以通過調用fopen獲取FILE *並使用一系列其他函數調用來操作它,但您可能看不到它指向的數據。

要了解有關CI中面向對象編程的更多信息,請參閱ANSI-C中的免費在線書籍面向對象編程 看看這篇Dobbs博士的文章。 相關問題: C中的面向對象你能用 C 編寫面向對象的代碼嗎?

隱藏在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基本的OOP實現,多年來仍在使用,至少仍在AROS項目中使用,實現稱為BOOPSI ,也是一些GUI小工具(小部件)的基礎,但可以僅用於描述對象 ,這里是一個小介紹 (在Amiga Rom內核參考手冊中,它顯示了如何使用它向更多對象廣播信號,先鋒Qt的插槽/信號實現)。

在過去的幾天里我一直在研究Nim lang ,它生成C代碼(添加一些運行時,可能被禁用 ),用gcc / clang / tinycc等后端進行編譯,它支持一些OOP。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM