ES2 MUD LIB :: 東方故事二(ES2) 天朝帝國 mudlib 瀏覽展示

/doc/mudlib/inheritance

HOME :: doc :: mudlib :: inheritance
□ 繼承

    相信有為數不少的巫師對於  LPC 物件的「多重繼承」感到困惑﹐這是因為許
多 mudlib 的繼承結構十分混亂﹐而且沒有固定風格﹐因此這裡特別說明一下我們
的繼承結構所遵循的風格﹕

    「任何物件﹐可以繼承最多一個『標準物件』﹐和接著標準物件的繼承敘述之
後﹐若干個『物件特徵』。」

    其中的『物件特徵』以『標準物件』所未曾繼承過的物件特徵為限﹐換句話說
一個物件特徵不應該在任何物件中被繼承超過兩次以上。

□ 標準物件 (standard objects)

    也就是位於 /std 下的物件﹐這些物件如果加上一個適當的 create() 函數就
可以成為一個完整的物件。不過﹐無論在任何情況下﹐都不應該對一個標準物件做
clone 的動作﹐你只能繼承它。

    標準物件作為各式物件的主體﹐如果一個物件除了標準物件外沒有另外繼承任
何其他的物件特性﹐而且物件中除了 create() 之外沒有第二個函數﹐如一般的房
間、怪物、物品等﹐應該在 create() 函數結束之前﹐用 replace_program()  將
自己的程式用標準物件取代﹐因為 create() 只有在物件被創造(或 clone)出來時
執行一次﹐以後再也用不到了﹐所以乾脆用所繼承的標準物件取代﹐這樣可以省下
為數不少的記憶體。

    在某些情形下﹐一個標準物件只是另一個標準物件與一些物件特性的組合﹐其
物件本身並不定義其他的函數﹐如 npc.c﹐原因是因為我們「常常會用到這樣的組
合」﹐如果將這樣的組合定義為一個標準物件﹐就可以用前面提到的在 create()
中用  replace_program 省下不少記憶體﹐因為標準物件的程式在記憶體中只存一
份而已。

□ 物件特性 (features)

    也就是 /feature 下的物件﹐這些物件只是提供單一的屬性模組﹐是純粹用來
被繼承的物件﹐當然﹐絕對不應該去 clone 它﹐你只能繼承它。

    定義物件特性的原則是「模組化」﹐也就是說﹐要能盡量在獨立於標準物件外
的情形下工作﹐雖然完全獨立是不可能的﹐但「盡量就是」。物件特性﹐顧名思義
﹐提供的是一項特性(如 equip.c)、特殊功能(如 alias.c, more.c)、或一些相互
關連密切的函數組成的模組(如 attack.c) ﹐如果所要描述的特性具有能讓許多不
同物件使用的性質﹐應該優先把它寫成一個物件特性﹐反之﹐則把它寫成一個標準
物件。

    好了﹐看了這麼多文謅謅的定義﹐我們用一個例子來解釋「標準物件」和「物
件特性」的意義。比方說我們要寫一個能夠裝備的劍之精靈(生物)﹐用以下的繼承
方式定義﹕

    inherit NPC;        // 標準物件 NPC
    inherit F_EQUIP;    // 物件特性 「可裝備」

    聰明的你﹐到這裡應該看得出這種組合的彈性了吧﹐因為  NPC 並不具有能讓
不同物件使用的性質﹐因此我們把它寫成標準物件﹐而「可裝備」因為具有這種性
質﹐所以寫成一個物件特性﹐如果在傳統的 mudlib ﹐monster.c 與 weapon.c 都
是「標準物件」型的物件﹐就算有哪位巫師膽敢同時繼承這兩個檔案﹐後果一定相
當可怕。

    如果你細心的話﹐其實可以發現分析到最後﹐一個最基本的標準物件只是幾個
物件特性的組合﹐所謂的標準物件事實上是將一些物件特性「包裝」起來﹐所以理
想中應該「盡量避免」在標準物件中定義函數﹐但是也不必過分地硬將所有的標準
物件拆開成一些奇怪的物件特性﹐這些東西可能和遊戲系統規劃者的思考方式與個
人喜好有關﹐總而言之﹐「簡單」「合理」「富彈性」應該是設計繼承結構的主要
考量。

By Annihilator@ES2 (12-14-94)
HOME :: doc :: mudlib :: inheritance