zoukankan      html  css  js  c++  java
  • lua继承

    Account = {balance = 0}
    function Account:new (o)
    o = o or {}
    setmetatable(o, self)
    self.__index = self
    print("This is Base")
    return o
    end
    function Account:deposit (v)
    self.balance = self.balance + v
    end
    function Account:withdraw (v)
    if v > self.balance then
    error"insufficient funds"
    end
    self.balance = self.balance - v
    end
    SpecialAccount = Account:new()
    function SpecialAccount:withdraw (v)
    if v - self.balance >= self:getLimit() then
    print("error insufficient funds")
    return -1
    end
    self.balance = self.balance - v
    end
    function SpecialAccount:getLimit ()
    return self.limit or 0
    end
    s = SpecialAccount:new{limit=1000.00}
    --在Lua中面向对象有趣的一个方面是你不需要创建一个新类去指定一个新的行为.
    --如果仅仅一个对象需要特殊的行为,你可以直接在对象中实现
    function s:getLimit ()
    return self.balance * 0.10
    end
    s:deposit(100.00)	--调用基类的存钱函数
    print(s.balance)
    s:withdraw(200.00)	--调用子类的取钱函数,取钱失败
    print(s.balance)
    s:getLimit()		--调用了s:getLimit ()
    print(s.limit)
    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 ,这个函数被重载了。

    http://blog.codingnow.com/cloud/LuaOO

    http://book.luaer.cn/_98.htm

    http://blog.csdn.net/lqk1985/article/details/7190971

  • 相关阅读:
    sql server 获取存储过程,表值,标量函数的参数
    拼接枚举字符串
    存储过程的输出接受强类
    映射对象
    C# abstract,virtual 修饰符
    SqlSugar之SqlQueryDynamic返回值处理
    sql server 中数据库数据导入到另一个库中
    sql server 自增长显式添加值
    sql得到表中的列信息
    程序中MMap集合数据重复导致程序慢的情况
  • 原文地址:https://www.cnblogs.com/byfei/p/14104563.html
Copyright © 2011-2022 走看看