1. 程式人生 > >C語言實現面向物件

C語言實現面向物件

無意間在複習C的時候想到了這個主題,於是翻了點資料實現了一下,純練手。

//
//  main.c
//  individual_test
//
//  Created by Amuro on 2016/12/28.
//  Copyright © 2016年 Amuro. All rights reserved.
//

#include <stdio.h>
#include <stdlib.h>

/****************Object*******************/
#define ObjectField void(*onDelete)(void*)

typedef struct Object
{
    ObjectField;
} Object;

#define ObjCreate(TYPE) malloc(sizeof(TYPE))

#define ObjDelete(obj) {\
    obj->onDelete(obj);\
    free(obj);\
}

void
ObjOnDelete(void* obj) { printf("obj on delete\n"); } Object* ObjInit(Object* obj) { obj->onDelete = ObjOnDelete; return obj; } /*************People extends Object**************/ typedef struct People { ObjectField; int age; void(*sayHello)(); }People; void PeopleSayHello() { printf("hello\n"
); } void PeopleOnDelete(void *p) { ObjOnDelete(p); printf("people on delete\n"); } People* PeopleInit(People *p, int age) { ObjInit((Object*)p); p->age = age; p->sayHello = PeopleSayHello; p->onDelete = PeopleOnDelete; return p; } int main(int argc, const char
* argv[]) { People* p = PeopleInit(ObjCreate(People), 20); p->sayHello(); ObjDelete(p); return 0; }

首先一個小tips就是C中的類基本是靠結構體實現的,但是C中又沒有成員函式這個概念,所以這裡就用到函式指標,但這個函式的實體,還是在結構體外部實現的。我們會在初始化的時候,把這個函式賦給這個指標。

下面講面向物件。
面向物件三大特性:抽象,繼承,多型。
C語言本身設計的時候這三個特性是一個都木有的,但是C有一個看似平常但非常牛X的東西,就是define。因為它的本質就是直接把後面的內容複製貼上到所在的程式碼塊。所以抽象,繼承和多型,我們都可以通過define來實現。另外,C還有一個萬能指標void*,它可以指向任何其他型別的指標。
抽象,在示例中我們可以看到,我們可以把Java介面或者抽象類中的abstract方法,定義成一個模板,放在父類中,子類中直接加入該模板即可。
繼承,剛才說了,子類中直接加入該模板就可以實現父類中必須要求實現的方法或成員,也就是實現了繼承,類似java的super。super後面你就可以實現子類自己的程式碼邏輯了。
多型,C的結構體指標有一個特性,如果一個結構體B內部的成員宣告時型別和順序和A一樣,即使B後面有比A更多的成員,依然可以把B的指標強轉成A的指標,並可以正常執行A指標中所有的成員或方法,參考上面程式碼的59行。

做完善了可以封裝一套面向物件的C庫,實現自己的面向物件能力。