前言
本文略谈C面向对象风格编程,如何使用过程式语言去模拟面向对象的特性?C面向对象的方式和形式很多,不一而足,本文的代码形式是模拟部分C++面向对象关键词并赋予其特性,这种方式对于初级程序员比较好理解。但是要明确的是,只要使用OO思想编写程序,那么写出的就是面向对象代码,比如Linux C。面向对象语言如C++,Java则是在编译器层面为语言做了那部分工作,所以使用过程式语言则需要通过写代码手动完成那部分工作。
面向对象简述
面向对象具备3大特性:封装、继承和多态。大多数语言都具有封装特性,只不过面向对象在封装上进一步增强,并且将数据和方法进行糅合。在面向对象中*存在是类和对象,而在过程式语言中函数则是*存在。
上代码和示例
Object.h是所有类需要包含的,Person.h里面有人类示例,ObjectStyleCoding.cpp是C语言面向对象示例。本文旨在抛砖引玉。并未实现继承和多态因为其比较复杂,但其思想是结构指针、查表和判断。
Object.h:
#include<stdlib.h>
#ifdef Cplusplus_H
namespace ObjectStyleCLang{
#else
extern "C"{
#endif #ifndef Object_Header_H
#define Object_Header_H
//boolean define
#define TRUE 1
#define FLASE 0 //class key words define
#define Public
#define Private static
#define ClassStatement(ClassName) struct ClassName
#define Class(ClassName) struct ClassName
#define ClassInnerPointer(ClassName) Class(ClassName)*ObjectThis
//memory define
#define NewArray(type,size) ((type*)malloc(sizeof(type)*size))
#define New(type) NewArray(type,1)
#define Delete(memory) free(memory) void ObjectCopy(unsigned char*,unsigned char*,unsigned int);
void ObjectCopy(unsigned char* dst,unsigned char* src,unsigned int Len)
{
unsigned int i=;
for(;i<Len;i++){
dst[i]=src[i];
}
} void StrCopy(char*dst,const char*src)
{
while (*src)
*dst++=*src++;
} #endif #ifdef Cplusplus_H
}
#else
}
#endif
Person.h:
#include "stdafx.h"
#include "Object.h" #ifdef Cplusplus_H
namespace ObjectStyleCLang{
#else
extern "C"{
#endif #ifndef Person_Header_H
#define Person_Header_H ClassStatement(Person);
Public void Person_constructor(Class(Person)*);
Public void setage(Class(Person)*,int);
Public int getage(Class(Person)*);
Public void setname(Class(Person)*,char*);
Public char* getname(Class(Person)*self); Class(Person){
//Class data
ClassInnerPointer(Person);
//Class data
Public int age;
Public char name[];
//method
Public void (*setAge)(Class(Person)*,int);
Public int (*getAge)(Class(Person)*);
Public void (*setName)(Class(Person)*,char*);
Public char* (*getName)(Class(Person)*);
}; Public void Person_constructor(Class(Person)*self)
{
self->ObjectThis=self;
self->getAge=getage;
self->setAge=setage;
self->getName=getname;
self->setName=setname;
self->age=self->name[]=;
} Public void setage(Class(Person)*self,int age)
{
self->age=age;
}
Public int getage(Class(Person)*self)
{
return self->age;
}
Public void setname(Class(Person)*self,char* str)
{
StrCopy(self->name,str);
}
Public char* getname(Class(Person)*self)
{
unsigned char i=;
char* name = NewArray(char,);
while(self->name[i]){
name[i]=self->name[i];
i++;
}
name[i]='\0';
return name;
} #endif #ifdef Cplusplus_H
}
#else
}
#endif
ObjectStyleCoding.cpp:
// ObjectStyleCoding.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "Person.h"
#include<iostream> int _tmain(int argc, _TCHAR* argv[])
{
Class(Person) fang;
Person_constructor(&fang);//构造函数
fang.setAge(&fang,);
fang.setName(&fang,"fang");
std::cout<<fang.getName(&fang)<<std::endl;
return ;
}