구름바람의 루아 대상 코드 분석

12030 단어 lua
문서 목록
  • 1.구름바람 lua 대상방향
  • 2.지식 포인트
  • 1. __index
  • 2. __newindex
  • 3.코드 해석
  • 하나.구름 바람
    구름바람wiki:https://blog.codingnow.com/cloud/LuaOO
    local _class={}
     
    function class(super)
    	local class_type = {}
    	class_type.ctor = false
    	class_type.super = super
    	class_type.new=function(...) 
    			local obj={}
    			do
    				local create
    				create = function(c,...)
    					if c.super then
    						create(c.super,...)
    					end
    					if c.ctor then
    						c.ctor(obj,...)
    					end
    				end
     
    				create(class_type,...)
    			end
    			setmetatable(obj,{ __index=_class[class_type] })
    			return obj
    		end
    	local vtbl={}
    	_class[class_type]=vtbl
     
    	setmetatable(class_type,{__newindex=
    		function(t,k,v)
    			vtbl[k]=v
    		end
    	})
     
    	if super then
    		setmetatable(vtbl,{__index=
    			function(t,k)
    				local ret=_class[super][k]
    				vtbl[k]=ret
    				return ret
    			end
    		})
    	end
     
    	return class_type
    end
    

    클래스 정의
    base_type = class()		--        base_type
     
    function base_type:ctor(x)	--    base_type      
    	print("base_type ctor")
    	self.x=x
    end
     
    function base_type:print_x()	--          base_type:print_x
    	print(self.x)
    end
     
    function base_type:hello()	--           base_type:hello
    	print("hello base_type")
    end
    
    test=class(base_type)	--       test     base_type
     
    function test:ctor()	--    test      
    	print("test ctor")
    end
     
    function test:hello()	--    base_type:hello   test:hello
    	print("hello test")
    end
    

    클래스 사용
    a = test.new(1)	--     ,base_type ctor   test ctor 。           。
    a:print_x()	--    1 ,      base_type       。
    a:hello()	--    hello test ,        。
    

    둘.지식점
    1. __index
    __index는 탭에 존재하지 않는 필드를 찾을 때 터치합니다. 탭에 있는 필드의 기본값 문제를 해결하는 데 도움을 줄 수 있습니다.모듈을 계승하려면
    setmetatable(obj, {__index = XXX})
    
    XXXX 계승을 희망하는 모듈 이름입니다.
    2. __newindex
    __새 index는 테이블에 존재하지 않는 필드에 대한 값을 감시하는 데 사용됩니다.새 index 메타데이터가 호출될 때 세 개의 인자가 전송됩니다:table 자체, 필드 이름, 부여하고자 하는 값입니다.
    setmetatable(obj, { __newindex = 
        function(t, k, v) 
           -- TODO
        end
        })
    

    이제 위에 운풍대신의 루아 코드를 해석해 보도록 하겠습니다.
    셋.코드 해석
    -- _class         
    local _class = {}
    
    --         ,super   
    function class(super)
    	-- class_type         
    	local class_type = {}
    	-- ctor     
    	class_type.ctor = false
    	--     
    	class_type.super = super
    	--   new    
    	class_type.new = function(...) 
    			local obj = {}
    			do
    			    -- create         ,        ctor  ,        
    				local create
    				create = function(c,...)
    					if c.super then
    					   --      ,       ctor  
    						create(c.super, ...)
    					end
    					if c.ctor then
    						--       
    						c.ctor(obj, ...)
    					end
    				end
     
    				create(class_type, ...)
    			end
    			-- obj  _class[class_type],       vtbl,obj     
    			setmetatable(obj, { __index = _class[class_type] })
    			-- new    obj  
    			return obj
    		end
    		
    	-- vtbl        
    	local vtbl = {}
    	_class[class_type] = vtbl
    	
        -- class_type        ,  vtbl 
    	setmetatable(class_type, { __newindex=
    		function(t, k, v)
    			vtbl[k] = v
    		end
    	})
     
    	if super then
    	    --      ,        ,  _class       ,              vtbl
    	    --     ,       ,     ,           
    		setmetatable(vtbl, { __index = 
    			function(t, k)
    				local ret = _class[super][k]
    				vtbl[k] = ret
    				return ret
    			end
    		})
    	end
     
        --      ,    ctor  ,        ,       vtbl ,
        --    new     ,    vtbl ctor  ,  obj
        --          ,    obj     ,  obj   vtbl,     vtbl     
        --   vtbl      ,        
    	return class_type
    end
    

    좋은 웹페이지 즐겨찾기