Sprite = {x = 0, y = 0, pos = {z=0}}
function Sprite:new()
o = {}
setmetatable(o,self)
self.__index = self
return o
end
s1 = Sprite:new()
s2 = Sprite:new()
s1.x = 10
s1.pos.z = 5
print("s1.x", s1.x, "s2.x", s2.x, "s1.z",s1.pos.z, "s2.z", s2.pos.z)
s2.x = 20
s2.pos.z = 50
print("s1.x", s1.x, "s2.x", s2.x, "s1.z",s1.pos.z, "s2.z", s2.pos.z)
에서 테이블 속성을 상속 할 수 없습니다, 나는 x(int),y(int),pos(table)
3 속성이 클래스 Sprite
를 정의하지만 두 객체 s1,s2
를 초기화하기 때. 나는 그들이 pos
속성을 공유하고있는 것을 발견했습니다. s1.pos.z
가 s2.pos.z
그래서, 변경되는 경우,위의 코드에서 부모
s1.x 10 s2.x 0 s1.z 5 s2.z 5
s1.x 10 s2.x 20 s1.z 50 s2.z 50
s1
및 s2
자신의 x,y
속성을 가지고 있지만, pos
속성을 공유 : 당신이 코드를 실행하면
, 그것을 인쇄 할 수 있습니다.
어떻게 해결할 수 있습니까?
'self .__ index = self'는'Sprite : new' 외부에서 수행되어야합니다. – lhf
그러나 클래스의 모든 데이터를 복사하면'__index'는 어떤 목적으로 사용됩니까? 결코 부름을받지 않을 것입니다. – lhf
@lhf 필드 값 (instanceData) 만 복사합니다. 메서드를 복사 할 필요가 없으므로 metatable이 메서드에 더 좋습니다. 그것은 클래스 테이블을 만드는 더 명확한 해결책이 될 것이지만, 그것의 간단한 예입니다. 어쩌면 나중에 제공 할 것입니다. – Seagull