【Lua】题目小练8
-- 题目 1:定义一个类 Person
-- 属性:name、age,其中 age 默认是 0,不能小于 0。
-- 方法:introduce(),输出 \"My name is , I am years old.\"
-- 要求使用封装思想,age 设置必须通过一个方法 setAge(age),并在方法中处理合法性。
local Person = {}Person.__index = Person--构造函数function Person:new(name, age) local obj = { name = name or \"UnKnow\", age = 0, } setmetatable(obj,self) obj:setAge(age) return objendfunction Person:introduce() print(\"My name is \"..self.name..\", I am \"..self.age..\" years old.\")endfunction 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.\") endend
-- 题目 2:类中添加私有方法(模拟私有函数)
-- 在 Person 类中,添加一个私有函数 calculateBirthYear(currentYear),根据年龄推算出生年份。
-- 在 introduce() 中调用它,输出内容增加一句:\"I was born in .\"
-- 提示:Lua 本身没有私有函数机制,但可以通过 local 函数模拟。
local function calculateBirthYear(self, currentYear) return currentYear - self.ageendfunction Person:introduce() print(\"My name is \"..self.name..\", I am \"..self.age..\" years old.\") print(\"I was born in \"..calculateBirthYear(self, 2025)..\".\")endlocal o = Person:new(\"Keixo\",12)o:introduce()
-- 题目 3:定义子类 Student 继承 Person
-- 除了继承的属性和方法外,还新增属性 school,方法 introduce() 要重写,输出:
-- My name is , I am years old.
-- I study at .
-- 同时添加方法 study(subject),输出:\" is studying .\"
local Student = {}Student.__index = Studentsetmetatable(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 objendfunction Student:introduce() print(\"My name is \"..self.name..\", I am \"..self.age..\" years old.\") print(\"I study at \"..self.school..\".\")endfunction Student:study(subject) print(self.name..\" is studying \"..subject..\".\")endlocal u = Student:new(\"Z\",-2, \"nihao\")u:introduce()u:study(\"Math\")
-- 题目 4:定义子类 Teacher 继承 Person
-- 属性:subject,
-- 方法:teach() 输出:\" is teaching .\"
-- 并重写 introduce() 输出:
-- My name is , I am years old.
-- I teach .
local Teacher = {}Teacher.__index = Teachersetmetatable(Teacher, {__index = Person})function Teacher:new(name, age, subject) local obj = Person.new(self,name, age) obj.subject = subject -- setmetatable(obj, self) return objendfunction Teacher:teach() print(self.name..\"is teaching \"..self.subject..\".\") print(\"I teach \"..self.subject..\".\")endlocal y = Teacher:new(\"y\", 20, \"Math\")y:introduce()y:teach()
-- 题目 5:实现一个多态接口 introduceAll
-- 定义一个函数 introduceAll(personList),参数是一个表,内部调用每个人的 introduce() 方法。
-- 传入 Person、Student、Teacher 等不同对象,验证其输出是否符合多态行为。
local function introduceAll(personList) for i, person in ipairs(personList) do person:introduce() endendlocal 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 实现。
Person.isAdult = function(age) return (type(age) == \"number\" and age >= 18) and true or falseendprint(o.isAdult(9))
-- 题目 7:模拟构造函数重载
-- 修改 Person:new(),支持两种构造方式:
-- Person:new(name, age)
-- Person:new({name = \"xx\", age = xx})
-- 要求两种方式都能成功创建对象。
function 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 objendlocal p = Person:new(\"p\", 12)local k = Person:new({name = \"k\", age = 12})p:introduce()k:introduce()