2014年4月11日 星期五

嵌入式上的OO(物件導向)

前言,
在228我回去高雄,參加了高雄科學園區所辨的徵才。但我志不在參加這個,而是在看那些大廠們(好像也沒幾家,只有一家鴻海)未來需要什麼人材,關於我這一方面的未來趨勢及發展。

行動裝置的需求(系統平台win 'linux,圖形driver QT'GTK等),雲端,big data(machine learn) 及跨平台語言(HTML5)。在接下來,換成校園徵才活動。希望自己有時間能去參加更希望有機會跟業界的人接觸好讓自己準備。

=========================
之前,自己一直在想要"如何將OO導入嵌入系統",本來是想要去研究QT'GTK ,因為它們也是由C語言寫成OO的架構。但,果然自己沒個底的話,大腦果然自己去delelte 這個。

回去時候,重翻了書本。看到相關的內容這裡我整理一下,並希望自己能將它螎入我的東西裡。


//my_object.h
//attribute
struct my_object
{
//所有類別都有的屬性,用來記錄該類別的基本屬性
//這個屬性必須是所有類別屬性的第一個,用來做polymorphism
OBJECT base;

//public attribute
int public_att1;
int public_att2;

//私有屬性
int private_att1;
int private_att2;
};
//define new data type
typedef MY_OBJECT my_object

//類別屬性,class or static attribut,全域
extern int my_obj_class_attr1;
extern int my_obj_class_attr2;
//公用方法(public method)宣告
//function name必須明確指出那個物件
//其傳入參數為讓物件的指標

//contructor
//C中沒有同名函式,用下列代替
int my_obj_constructor_1(MY_OBJ* theobj,int parameter1);
void my_obj_constructor_2(MY_OBJ* theobj);

//de constructor
void my_obj_desconstructor(MY_OBJ* theobj);

//一般方法宣告
void my_obj_public_method1(MY_OBJ* theobj);

//======================================
//my_object.c
#include "my_obj.h"

//定義屬性及方法

int my_obj_class_attr1=0;
int my_obj_class_attr2=0;

//private method, static function
staic void my_obj_private_method(MY_OBJ* theobj)
{
//operator theobj 的所有(含私有)屬性/方法
...
}

staic void my_obj_private_metho2d(MY_OBJ* theobj)
{
//operator theobj 的所有(含私有)屬性/方法
theobj->public_attr1=0;
theobj->private_attr2=0;
my_obj_private_method(theobj);
}

//public method
void my_obj_public_method1(MY_OBJ* theobj)
{
//可operator theobj的所有屬性方法
...
}

int my_obj_getattr_method1(MY_OBJ* theobj)
{
//用來對外窗口
return theobj->private_att1;


//=================
//instance
//實作,main.c
#include "my_obj.h"

void other_function(void)
{
MY_OBJ A;
MY_OBJ B;

int result;

//call constructor
result = my_obj_constructor_1(&A,1);
my_obj_constructor_2(&B);

//在外部可operator public attaribute and method

A.public_att1 =0;

//invocation
my_obj_public_method1(&A);

//deconstructor
my_obj_desconstructor(&A);
}

//message passing
//base_class.h
#define BASE_OBJ_VALID_FLAGE 0XABCDEF
struct base_class
{
//private attribute
//是否為合法class(assign BASE_OBJ_VALID_FLAGE)
int valid_obj_flag;
//為每個類別編號,以此得知傳入為那個物件

int object_type;
char obj_name[5];
};
typedef OBJECT base_class

char* base_obj_get_object_name(OBJET* theobj);
int base_obj_check_invalue_flag(OBJECT *theobj);
int base_obj_get_object_type(OBJET* theobj);

//base_class.c
public method define
//傳入是否為合法
int base_obj_check_invalue_flag(OBJECT *theobj)
{
if(theobj->valid_obj_flag= BASE_OBJ_VALID_FLAGE)
    return true;
else
    return false;
}

//取得物件的型別
int base_obj_get_object_type(OBJET* theobj)
{
   if(base_obj_check_invalue_flag(theobj))
    return theobj->object_type;
   else
    return 0;
}

//取得物件名稱
char* base_obj_get_object_name(OBJET* theobj)
{
   if(base_obj_check_invalue_flag(theobj))
    return theobj->object_name;
   else
    return 0;
}

//printf the object attribut
void show_object_info(OBJECT *theobj)
{
   if(base_obj_check_invalue_flag(theobj)==false)
        return;//not vaild object
  
   switch(base_obj_get_object_type(theobj))
{
    case OBJ_TYPE_1:
        break;
    case OBJ_TYPE_2:
        break;
    case OBJ_TYPE_3:
        break;
    default:
        break;
}
//show the name
printf("%s",base_obj_get_object_name(theobj));
}

//test.c
void main()
{
OBJECT_TYPE_1 A;
//...contructuor
//轉成基本類別,任一類別中第一個attribut都是基本類別
show_object_info((OBJECT*)&A);
}

//===================
//繼
//suport class
struct parent_obj
{
OBJECT base;

int papa_attr1;
int papa_attr2;

...
};
typefdef PAPA_OBJ struct parent_obj;

//父類別的公用方法
void papa_public_method1(PAPA_OBJ* theobj);

//sub class define
struct child_obj
{
PAPA_OBJ papa; //inhinernet

int child_attr1;
int child_attr2;
....
};

typedef CHILD_OBJ struct child_obj;
//public child method

void child_public_metho(CHILD_OBJ *papa);

//==============
//test.c
void test(void)
{
CHILD_OBJ child;
PARA_OBJ* pParentObj;

//操作子物件attribute/method
child.child_attr2=1;
child_public_method1(&child);

//轉換
pParentObj =(PAPA_OBJ*)child;
//operator parent method/attribute
pParentObj->papa_attr1 =2;
papa_public_method2(&pParentObj);
//the same
child.papa.papa_attr1=1;
papa_public_method1((PAPA_OBJ*)(&child));
}

//polymorphism

//sub class 2 define
struct child_obj2
{
PAPA_OBJ papa; //inhinernet

int child2_attr1;
int child2_attr2;
....
};

typedef CHILD_OBJ2 struct child_obj2;
//sub class 2 public method
void child2_public_method1(CHILD_OBJ* papa);

//polymorphism 可處理多種類別的函式,但傳入是suport class

int papa_obj_polymorphism_method(OBJECT* kind_of_papa_obj)
{
//是否為有效物件
   if(base_obj_check_invalue_flag(theobj))
    return false;
   switch(base_obj_get_object_type(theobj))
{
    case OBJ_TYPE_PAPA:
        papa_public_method1((PAPA_OBJ*)kind_of_papa_obj);
        break;
    case OBJ_TYPE_1:
        child_public_method1((CHILD_OBJ*)kind_of_papa_obj);
        break;
    case OBJ_TYPE_2:
        child2_public_method1((CHILD_OBJ2*)kind_of_papa_obj);
        break;
    default:
        return false;
        break;
}
return true;
}


//test program

void test(void)
{
PAPA_OBJ A;
CHILD_OBJ B;
//CONSTRUCTOR

//polymorphism,
papa_obj_polymorphism_method((OBJECT*)(&A));
papa_obj_polymorphism_method((OBJECT*)(&B));
}

沒有留言:

張貼留言