2011-07-07 4 views
1

これは、C++でLua C APIを使ってやりたいことです。他のメタデータから継承するメタデータを設定すると同時に、ユーザーデータを別のタイプに変更する方法を教えてください。

私はuserdataを基本のuserdataオブジェクトから派生させる良い方法を見つけようとしています。 、これらの例では、私を

local item = me:GetCurrentItem() 
print(item:GetBaseObject():GetPos()) 

local item = me:GetCurrentItem() 
print(item:GetPos()) 

の代わり:

が、私はこれを行うことができるようにしたいGetCurrentItem()は、一部の機能でユーザデータを返しますが、それがベースに欠けますitem:GetBaseObject()が返す関数。

私は学習目的でCrysis Wars SDKのLuaをバインドしています。 SDKは構造体である基本エンティティへのインタフェースを提供します。 IItem構造体(me:GetCurrentItem())は同じです。 これらは構造体なので、それらを基本構造体にキャストしたり、基本関数を呼び出すことはできません。 IEntity * GetEntity()関数を使用する必要があります。

私は__indexで自己ポインタを変えようとしましたが、局所変数 "item"が "entity"になってしまいましたが、GetPos関数を呼び出した後に元に戻す必要があります。 。

誰にもこの問題の良い解決策がありますか?

答えて

2

明らかな解決策は、アイテムを定義することです:リダイレクトを行うGetPos()関数。

function Item:GetPos() 
    return self:GetBaseObject():GetPos() 
end 

ここで、itemはアイテムのメタテーブルです。

これは、メタテーブルの変更を行うのと同じくらい効率的ですが、問題はありません。

編集:私はあなたにも反復性を少しでもお手伝いできます。

function delegate(klass, methodName, memberName) 
    klass[methodName] = function(self, ...) 
    local member = self[memberName] 
    if type(member) == 'function' then member = self[memberName](self) end 
    return member[methodName](member, ...) 
    end 
end 

をし、このようにそれを使用します:

次の2つの機能を実装することができ、単一の行は上記Item:GetPos 3ラインの定義と同じ操作を行うwhould

delegate(Item, 'GetPos', 'GetBaseObject') 

こと。あなたはこのロットを繰り返す必要がある場合は

、あなたは、この他の機能と、さらにそれを最適化することができます

deletageMany(Item, {'GetPost', 'SetPos', 'GetColor', 'SetColor'}, 'GetBaseObject') 

を、私はいずれかをテストしていない:あなたができるようにする必要があり

function delegateMany(klass, methodNames, memberName) 
    for _,methodName in ipairs(methodNames) do 
    delegateMethod(klass, methodName, memberName) 
    end 
end 

これらの機能のうち、バグに注意してください。彼らは両方の "入手したプロパティ"(self:GetSomething()と同様に簡単なアクセスself.something)で動作する必要があります。このコードでは、委任されたメソッドを呼び出すために常に ':'を使用すると仮定しているため、必要なときにはselfが追加されます。

+0

いい方法がないとすれば、これを行うと思っていました。ベースエンティティには、私が使用しようとしている多くの機能があるので、すべてのクラスで同じ機能を再度追加することは、非常に繰り返しが必要です。 – CapsAdmin

+0

多分私はこれを実現する必要があります。 – CapsAdmin

+0

@CapsAdmin繰り返しコードは決して良いことではありません。私はあなたがよりきれいな方法であなたが望むことができるようにするべきであるいくつかのコードを追加しました。あなたはそれに問題がある場合は教えてください。 – kikito

関連する問題