10.18.2007

modify some codes..

需求:
  • Class source 加進來就可以用。
source filename 不同,但是class name相同,class interface 相同。

或是..

將interface 獨立宣告出來。各project 衍生出不同的實做。 client code 操作 interface介面。
  • 問題:client code與interface衍生class 的實體發生關聯的方法是 ?
    使用 pointer ? Robert作不喜歡 pointer
原因查出:
  • 因為Robert implement 的 startup code,沒有作ctor section 的初始化,所以不能用 new 運算原。
所以並不是不能用pointer,而是不能用 new..

所以.. 用一個parent class 的 pointer 指向 child class 的實體 object是允許的。
所以.. 所有global object 改用 interface class,在global header file 宣告 interface pointer。然後在 程式啟動時,將實際生成的class 指定給 global interface pointer,讓其他的client code使用。


分析目前code架構,決定修改方法:

在GlobalObjectInit( )中作initialize : 在 CEntry( ) 中 _cpp_initialize( )後就執行,可以確保在任和class operation 之前會作初始化。

就從修改 GlobalObject.h 開始,將global class variable 宣告為 pointer。
CUART  *g_CUART;
CUART3 c_CUART;
c_XX 是實體, g_XX 是interface。
真正的作法是:
static CUART3  c_UART;
CUART *g_CUART = (CUART*)&c_UART;
CUART 是 CUART3 的parent class。
這應該才是Robert 當初設計的目的(?)


從 Mini 開始改起..
  • 還不錯,改了一兩個project後,接下來的project 很好改。
    證明這樣的架構不會引入新的關聯性。
  • 從 Mini 架構 fork 新project 也很容易。
問題:
  • 有些 header file 會區分 是否為 "Mini" project ,而 include 不同的 header,造成在 mini 中要使用完整版的class 出現問題。
  • 上面的例子都是出現在 使用到 class中的static function。

2 則留言:

鍾志均 提到...

我確認 你在寫中文 and 一點點的code
但是 不懂的佔大多數
1. 物件觀念似乎建立的不太好
2. 對原作者的設計似乎也沒辦法完全了解

我想 我該好好進修了

Checko 提到...

結果robert說他當初並沒要要這樣作,他只是單純的想共用code (少寫一些code)。

所以自然的建出 abstraction class..

至於他沒這樣作 (abstration class pointer)的原因是...每個child class 的 class name 他都用一樣的 .,,,,,,,

雖然是這樣,但是 include file 的部份還是沒辦法flexible吧.