无意间在复习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库,实现自己的面向对象能力。