研究了一下,總算勉強能夠融會貫通了
c寫成OOP還蠻有樂趣的
編譯環境:Xcode3.2.3+gcc4.2
/*<br /> * Cloud.h<br /> * CloudOOC<br /> *<br /> * Created by Cloud on 2010/8/21.<br /> * Copyright 2010 Orz. All rights reserved.<br /> *<br /> */<br />#ifndef OBJECT_H<br />#define OBJECT_H<br />typedef void (*Execute)(struct Object *a_This);<br />typedef struct Object* (*Allocate)();<br />typedef struct _Object_Vtable<br />{<br />char *name;<br />Execute exe;<br />}Object_Vtable;<br />typedef struct _baseCmd<br />{<br />Object_Vtable vtable;<br />}BaseCmd;<br />// --- for common --- //<br />BaseCmd* new(Allocate newObj);<br />void delete(void * item);<br />// --------------------------//<br />// --- for BaseCmd --- //<br />BaseCmd* NewBaseCmd();<br />void Exe_BaseCmd(BaseCmd *a_This);<br />// --------------------------//<br />// --- for HomeCmd --- //<br />typedef struct _homeCmd<br />{<br />Object_Vtable vtable;<br />}HomeCmd;<br />BaseCmd* NewHomeCmd();<br />void Exe_HomeCmd(HomeCmd *a_This);<br />// --------------------------//<br />#endif
/*<br /> * Cloud.c<br /> * CloudOOC<br /> *<br /> * Created by Cloud on 2010/8/21.<br /> * Copyright 2010 Orz. All rights reserved.<br /> *<br /> */<br />#include "Cloud.h"<br />// --- for common --- //<br />BaseCmd* new(Allocate newObj)<br />{<br />BaseCmd * obj = newObj();<br />return obj;<br />}<br />void delete(void * item)<br />{<br />free(item);<br />}<br />// --------------------------//<br />// --- for BaseCmd --- //<br />BaseCmd* NewBaseCmd()<br />{<br />BaseCmd * cmd = malloc(sizeof(BaseCmd));<br />cmd->vtable.name = "Cloud";<br />cmd->vtable.exe = Exe_BaseCmd;<br />return cmd;<br />}<br />void Exe_BaseCmd(BaseCmd *a_This)<br />{<br />printf("do base command = %s/n",a_This->vtable.name);<br />}<br />// --------------------------//<br />// --- for HomeCmd --- //<br />BaseCmd* NewHomeCmd()<br />{<br />HomeCmd * cmd = malloc(sizeof(HomeCmd));<br />cmd->vtable.name = "Home";<br />cmd->vtable.exe = Exe_HomeCmd;<br />return cmd;<br />}<br />void Exe_HomeCmd(HomeCmd *a_This)<br />{<br />printf("do home command = %s/n",a_This->vtable.name);<br />}<br />// --------------------------//
#include <stdio.h><br />#include <stdlib.h><br />#include "Cloud.h"<br />int main (int argc, const char * argv[])<br />{</p><p>BaseCmd* cmd = new(NewBaseCmd);<br />cmd->vtable.exe(cmd);<br />delete(cmd);</p><p>BaseCmd* cmd2 = new(NewHomeCmd);<br />cmd2->vtable.exe(cmd2);<br />delete(cmd2);</p><p> return 0;<br />}<br />