-- 题目 1:定义一个类 Person
-- 属性:name、age,其中 age 默认是 0,不能小于 0。
-- 方法:introduce(),输出 "My name is <name>, I am <age> years old."
-- 要求使用封装思想,age 设置必须通过一个方法 setAge(age),并在方法中处理合法性。
Lualocal Person = {} Person.__index = Person --构造函数 function Person:new(name, age) local obj = { name = name or "UnKnow", age = 0, } setmetatable(obj,self) obj:setAge(age) return obj end function Person:introduce() print("My name is "..self.name..", I am "..self.age.." years old.") end function Person:setAge(age) if (age and type(age) == "number" and age > 0) then self.age = age else print("[Warning] Invalid age value, defaulting to 0.") end end-- 题目 2:类中添加私有方法(模拟私有函数)
-- 在 Person 类中,添加一个私有函数 calculateBirthYear(currentYear),根据年龄推算出生年份。
-- 在 introduce() 中调用它,输出内容增加一句:"I was born in <year>."
-- 提示:Lua 本身没有私有函数机制,但可以通过 local 函数模拟。
Lualocal function calculateBirthYear(self, currentYear) return currentYear - self.age end function Person:introduce() print("My name is "..self.name..", I am "..self.age.." years old.") print("I was born in "..calculateBirthYear(self, 2025)..".") end local o = Person:new("Keixo",12) o:introduce()-- 题目 3:定义子类 Student 继承 Person
-- 除了继承的属性和方法外,还新增属性 school,方法 introduce() 要重写,输出:
-- My name is <name>, I am <age> years old.
-- I study at <school>.
-- 同时添加方法 study(subject),输出:"<name> is studying <subject>."
Lualocal Student = {} Student.__index = Student setmetatable(Student, {__index = Person}) function Student:new(name, age, school) local obj = Person.new(self, name, age) -- setmetatable(obj, self) obj.school = school or "UnKnow School" return obj end function Student:introduce() print("My name is "..self.name..", I am "..self.age.." years old.") print("I study at "..self.school..".") end function Student:study(subject) print(self.name.." is studying "..subject..".") end local u = Student:new("Z",-2, "nihao") u:introduce() u:study("Math")-- 题目 4:定义子类 Teacher 继承 Person
-- 属性:subject,
-- 方法:teach() 输出:"<name> is teaching <subject>."
-- 并重写 introduce() 输出:
-- My name is <name>, I am <age> years old.
-- I teach <subject>.
Lualocal Teacher = {} Teacher.__index = Teacher setmetatable(Teacher, {__index = Person}) function Teacher:new(name, age, subject) local obj = Person.new(self,name, age) obj.subject = subject -- setmetatable(obj, self) return obj end function Teacher:teach() print(self.name.."is teaching "..self.subject..".") print("I teach "..self.subject..".") end local y = Teacher:new("y", 20, "Math") y:introduce() y:teach()-- 题目 5:实现一个多态接口 introduceAll
-- 定义一个函数 introduceAll(personList),参数是一个表,内部调用每个人的 introduce() 方法。
-- 传入 Person、Student、Teacher 等不同对象,验证其输出是否符合多态行为。
Lualocal function introduceAll(personList) for i, person in ipairs(personList) do person:introduce() end end local people = { Person:new("p",1), Student:new("s",2), Teacher:new("t",3) } introduceAll(people)-- 题目 6:添加"静态方法"支持
-- 给 Person 添加一个类方法(静态方法)isAdult(age),返回是否大于等于 18 岁。
-- 提示:通过 Person.isAdult = function(age) ... end 实现。
LuaPerson.isAdult = function(age) return (type(age) == "number" and age >= 18) and true or false end print(o.isAdult(9))-- 题目 7:模拟构造函数重载
-- 修改 Person:new(),支持两种构造方式:
-- Person:new(name, age)
-- Person:new({name = "xx", age = xx})
-- 要求两种方式都能成功创建对象。
Luafunction Person:new(nameOrTable, age) local obj = {} if type(nameOrTable) == "table" then for i,v in pairs(nameOrTable) do obj[i] = v end elseif type(nameOrTable) == "string" then obj.name = nameOrTable obj.age = age end setmetatable(obj,self) return obj end local p = Person:new("p", 12) local k = Person:new({name = "k", age = 12}) p:introduce() k:introduce()
【Lua】题目小练8
大飞pkz2025-08-07 8:36
相关推荐
钟智强7 天前
CVE-2025-49844高危预警:Redis Lua脚本引擎UAF漏洞深度剖析与POC实战闲人编程8 天前
聚合管道与复杂查询会周易的程序员9 天前
cNetgate物联网网关内存数据表和数据视图模块架构会周易的程序员10 天前
cNetgate插件架构设计详解 动态库 脚本二开lua, python, javascript白太岁13 天前
Redis:(3) Lua 与 Redis、基于连接池的 Facade 模式封装Maguyusi18 天前
go 批量生成c++和lua proto文件foxsen_xia19 天前
Kamailio通过Lua写路由码农周21 天前
nginx + Lua 实现域名访问日志统计難釋懷22 天前
Lua脚本解决多条命令原子性问题AI_567825 天前
Postman接口测试提速技巧:批量请求+智能断言实践