-- 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