lw_oopc(C语言的面向对象)

    面向对象这个概念和C语言似乎是无缘的,但如果你真的很想用怎么办?幸运的是有人和你的想法一样,并且做出了实实在在的东西。我了解的比较多的是lw_oopc和ooc两个东东。

    ooc全称objective oriented c,作者做了大量的工作实现了c语言的封装、多态、继承这三种面向对象特征,还实现了所谓的虚函数。老实说,我对ooc的作者佩服的五体投地,能把c语言玩到这个程度非常了得了。ooc的文档工作做的也不错,但看了它的doc之后,还是觉得用起来有些麻烦。于是,又去google之,最终找到lw_oopc这个好东东。

    lw_oopc仅用了2个文件,.h及.c文件就实现了面向对象的三大因素,实现过程极为简洁又富含技巧。lw_oopc说白了,就是定义了一堆宏,使用起来也就是调用这些宏。

 

还是先以一个简单的例子入手,看看用lw_oopc做一个‘类’是怎样的。

————————————————————————————————————————————

设计一个抽象类:Animal,属性有:age,方法有:eat

继承Animal,设计一个类:Dog,实现其方法

继承Animal,设计一个类:Bird,增加方法:Fly

代码如下所示:

***********************************************************
#include <stdio.h>
#include "lw_oopc.h"

********************************
/* Animal */
ABS_CLASS(Animal)
{
    int age;
    
    void (*Init)(Animal*);
    void (*Eat)(Animal*);
};

static void Animal_Init(Animal* me)
{
    me->age = 0;
}

static void Animal_Eat(Animal* me)
{
    printf("Animal eat.\r\n");
}

ABS_CTOR(Animal)
FUNCTION_SETTING(Init, Animal_Init);
FUNCTION_SETTING(Eat, Animal_Eat);
END_ABS_CTOR

********************************
/* Dog */
CLASS(Dog)
{
    EXTENDS(Animal);
    
    void (*Init)(Dog*);
};

static void Dog_Init(Dog* me)
{
    SUPER_PTR(me, Animal)->Init(SUPER_PTR(me, Animal));
}

static void Dog_Eat(Animal* me)
{
    printf("Dog eat.\r\n");
}

CTOR(Dog)
SUPER_CTOR(Animal);
FUNCTION_SETTING(Init, Dog_Init);
FUNCTION_SETTING(Animal.Eat, Dog_Eat);
END_CTOR

********************************
/* Bird */
CLASS(Bird)
{
    EXTENDS(Bird);
    
    void (*Init)(Bird*);
    void (*Fly)(Bird*);
};

static void Bird_Init(Bird* me)
{
    SUPER_PTR(me, Animal)->Init(SUPER_PTR(me, Animal));
}

static void Bird_Fly(Bird* me)
{
    printf("Bird fly.\r\n");
}

static void Bird_Eat(Animal* me)
{
    printf("Bird eat.\r\n");
}

CTOR(Bird)
SUPER_CTOR(Animal);
FUNCTION_SETTING(Init, Bird_Init);
FUNCTION_SETTING(Animal.Eat, Bird_Eat);
FUNCTION_SETTING(Fly, Bird_Fly);
END_CTOR

 

    有了这些定义,用起来就跟简单c++的类一样了,只是定义一个类的实例时应采用如下一种格式:

Dog* dog = Dog_new();
dog->Init(dog);

调用自身的方法:

Bird* bird = Bird_new();
bird->Init(bird);
bird->Fly(bird);

调用继承的方法稍显麻烦:

((Animal*)bird)->Eat((Animal*)bird);

或者当EXTENDS语句在定义类时并不在第一句(下一篇将揭露各个宏的真实面目)时,最稳妥也显得繁琐一点的方式为:

SUPER_PTR(bird, Animal)->Eat(SUPER_PTR(bird, Animal));

    是不是有那么点意思,抽象、继承、多态几个概念都包含了。同样能看出,用了lw_oopc后并没有减少你的代码量,而是增加了不少。但用它的目的并非是减少体力输出,而是对软件结构的一种改良。

    各个宏的真实面目留待下一篇揭露。

转载于:https://www.cnblogs.com/robert-cai/p/3456785.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值