LUA单继承与多继承实验

-- base Class Object
CObject = { _obj_name = "CObject"}

function CObject:new (o)
	if (o and type(o) ~= "table") then
		error("base object is not a table")
	end
	o = o or {}
	setmetatable(o, self)
	self.__index = self
	return o
end

function CObject:dump_obj()
	return self._obj_name
end

CPerson = CObject:new{_obj_name = "CPerson", name = nil, age = 0}
function CPerson:self_introduce()
	return CObject.dump_obj(self) .. " name=" .. tostring(self.name) .. " age= " .. tostring(self.age)
end

CStudent = CPerson:new{_obj_name = "CStudent", student_id = nil}

function CStudent:self_introduce()
	return CPerson.self_introduce(self) .. " student_id=" .. tostring(self.student_id)
end


print(CStudent:dump_obj())

student_a = CStudent:new{name = "zhangsan", student_id = "8888"}
student_b = CStudent:new{student_id = "8889"}
print(student_a:dump_obj())

print(student_a:self_introduce())
print(student_b:self_introduce())

CTeacher = CObject:new{_obj_name = "CTeacher", teacher_id = nil}
function CTeacher:self_introduce()
	return CPerson.self_introduce(self) .. " teacher_id=" .. tostring(self.teacher_id)
end

teacher_a = CTeacher:new {name = "Zhang", age = "29", teacher_id = "99999"}
print(teacher_a:self_introduce())


print("------------------------")

local function inheritance_search (k, plist)
	for i = 1, #plist do
		if (type(plist[i]) ~= "table") then
			error("plist[" .. i .."] not a table")
		end
		local v = plist[i][k]
		if v then return v end
	end
end

function createClass (obj_name, ...)
	local c = { _obj_name = obj_name }
	local parents = {...}
	
	setmetatable(c, {__index = function (t, k)
		return inheritance_search(k, parents)
	end })
	
	c.__index = c;
	
	function c:new(o)
		o = o or {}
		setmetatable(o, c)
		self.__index = self
		return o
	end
	
	return c
end

CTeacherStudent = createClass("CTeacherStudent", CTeacher, CStudent)

ts_a = CTeacherStudent:new{name = "ts_a", age = 10, teacher_id = "ts_a_1", student_id = "ts_a_1"}
print(ts_a:self_introduce())

function CTeacherStudent:self_introduce()
	return CPerson.self_introduce(self) .. " teacher_id=" .. tostring(self.teacher_id) .. " student_id=" .. tostring(self.student_id)
end
print(ts_a:self_introduce())

CDoctorCTeacherStudent = CTeacherStudent:new{_obj_name = "CDoctorCTeacherStudent", doctor_id = "doctor_id"};
--print(CDoctorCTeacherStudent:self_introduce())
ts_doc_a = CDoctorCTeacherStudent:new{name = "doctor_a", age = "35", teacher_id = "t_doc_1", student_id = "s_doc_1", doctor_id = "doctor_1"}
print(ts_doc_a:self_introduce())


结果:

CStudent
CStudent
CStudent name=zhangsan age= 0 student_id=8888
CStudent name=nil age= 0 student_id=8889
CTeacher name=Zhang age= 29 teacher_id=99999
------------------------
CTeacherStudent name=ts_a age= 10 teacher_id=ts_a_1
CTeacherStudent name=ts_a age= 10 teacher_id=ts_a_1 student_id=ts_a_1
CTeacherStudent name=doctor_a age= 35 teacher_id=t_doc_1 student_id=s_doc_1


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值