속성 선언에 대한 자동 지원을 추가하여 클래스에 자동으로 생성되는 getter 및 setter를 가져옵니다. 중간 클래스 라이브러리를 클래스의 기반으로 사용합니다. 속성 생성을 처리하는 루트 클래스를 정의했습니다. 그러나 테스트에서 루트 클래스의 바로 하위 클래스 만 제대로 작동합니다. 다른 날 중산층 코드 깊은 스택 오버플로 오류 ([string "local middleclass = {..."]:82: stack overflow
) 줄.middleclass : 속성에 대한 getter-setter 지원 추가
내 코드는 다음과 같습니다
local CBaseObject=class('CObjectBase');
function CBaseObject:initialize()
self._init=true;
end;
function CBaseObject:finalize()
self._init=false;
end;
function CBaseObject:_getter_setter(v)
return v;
end;
function CBaseObject:_gen_prop_cache()
rawset(self,'_properties',rawget(self,'_properties') or {});
end;
function CBaseObject:__index(k)
print('GET',k);
self:_gen_prop_cache();
local prop=self._properties[k];
if prop~=nil
then
local getter=self[prop[2] or '_getter_setter'];
return getter(self,prop[1]);
else return nil;end;
end;
function CBaseObject:__newindex(k,v)
print('ME',self.class.name);
print('SET',k,v);
self:_gen_prop_cache();
local prop=self._properties[k];
if prop==nil and self._init or prop
then
if prop==nil then prop={};self._properties[k]=prop;end;
local vv=prop[1];
if type(v)=='table' and #v<4
then
for i=1,3 do prop[i]=v[i];end;
else
prop[1]=v;
end;
local setter=self[prop[3] or '_getter_setter'];
prop[1]=setter(self,prop[1],vv);
else
rawset(self,k,v);
end;
end;
테스트 클래스 :
local cls=CBaseObject:subclass('test');
function cls:initialize()
self.class.super.initialize(self);
self.health={1000,'_gethealth','_sethealth'};
self.ammo=100;
self:finalize();
end;
function cls:_sethealth(value,old)
print('WRITE:',value,old);
if value<0 then return old;else return value;end;
end;
function cls:_gethealth(value)
print('READ:',value);
return value/1000;
end;
local cls2=cls:subclass('test2');
function cls2:initialize()
self.class.super.initialize(self);
self.ammo=200;
self:finalize();
end;
function cls2:_sethealth(value,old)
print('WRITE_OVERRIDEN:',value,old);
return value;
end;
local obj=cls2(); --change this to cls() for working example.
obj.health=100;
obj.health=-100;
print(obj.health,obj._properties.health[1]);
print(obj.ammo,obj._properties.ammo[1]);
내 코드를 실행 https://repl.it/languages/lua을 사용했다. 그래서, 질문은, 내가 옳은 방법으로하는 것입니까? 사용 된 라이브러리와 호환되는 더 쉬운 방법으로 속성 지원을 추가 할 수 있습니까? 아니면 다른 것을 사용해야합니까?
편집 : 실험 후 나는 구조상 self.class.parent.<method>(<...>)
이 오류에 대한 책임이 있다는 것을 알아 냈습니다. 나는 그러한 모든 사건을 실제 부모 클래스로 바꿨다. 그게 유일한 문제 였고, 그 후 코드는 지금까지 오류없이 작동하기 시작했습니다.
질문에 직접 답변하거나 대답하거나 질문을 수정할 수없는 경우 ...당신은 thits 세미콜론 btw를 제거 할 수 있습니다. 그들은 루아에서 필요하지 않습니다. – Piglet
그러나 나는 아직도 내가 한 일을 잘 할 수 없다는 것을 확신하지 못한다. 세미콜론은 다른 언어로 습관을 버리고 싶지 않기 때문에 필자는 세미콜론을 사용합니다. 기본적으로 모든 언어가 필요합니다. – ZzZombo