我一直在嘗試使用Objective-C實現一個簡單的基於組件的遊戲對象體系結構,這與Mick West的文章'Evolve Your Hierarchy'大致相同。爲此,我已經成功地使用了Mike Ash所着的'Objective-C Message Forwarding'文章中提到的一些想法,也就是說使用-(id)forwardingTargetForSelector:
方法。Obj-C基於組件的遊戲體系結構和消息轉發
基本設置是我有一個容器GameObject類,它包含三個組件類的實例作爲實例變量:GCPositioning,GCRigidBody和GCRendering。 -(id)forwardingTargetForSelector:
方法返回哪個組件將響應相關選擇器,使用方法確定。
所有這些在某種程度上都像一個魅力:我可以在其中一個組件中找到實現的GameObject實例上調用方法,並且它可以工作。當然,問題在於編譯器在每次調用時都會給出'可能無法響應...'的警告。現在,我的問題是,我該如何避免這種情況?特別是關於這個事實,即GameObject的每個實例都會有一組不同的組件?也許一種方法來註冊容器對象的方法,每個對象的基礎上的對象?比如,我可以創建某種-(void)registerMethodWithGameObject:
方法,我該怎麼做?
現在,對於Cocoa和Objective-C來說,我可能並不是很清楚,基本上只是徘徊,而這整個事情在這裏可能非常陌生。當然,儘管我非常想知道我的具體問題的解決方案,但任何願意解釋更優雅方式的人都會非常歡迎。
大加讚賞,-Bastiaan
不幸的是我覺得警告會留下來,因爲它們在技術上是正確的。編譯器無法確定您的對象是否會實際響應,除非在接口中聲明瞭匹配的方法。也就是說,你可能可以將你的GameObject轉換爲'id'來避免它(醜陋)或者禁用警告作爲配置選項(醜陋)。 :/ – 2010-04-14 20:16:02
查看bbum對這個非常類似的問題的回答:http://stackoverflow.com/questions/2259012/avoiding-compiler-warnings-when-doing-message-forwarding。基本上:在你的類上聲明一個類別,並將轉發的方法放在該類別中。 – Felixyz 2010-04-15 01:49:55