【Lua】题目小练8

-- 题目 1:定义一个类 Person

-- 属性:name、age,其中 age 默认是 0,不能小于 0。

-- 方法:introduce(),输出 "My name is <name>, I am <age> years old."

-- 要求使用封装思想,age 设置必须通过一个方法 setAge(age),并在方法中处理合法性。

Lua 复制代码
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 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 函数模拟。

Lua 复制代码
local 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>."

Lua 复制代码
local 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>.

Lua 复制代码
local 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 等不同对象,验证其输出是否符合多态行为。

Lua 复制代码
local 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 实现。

Lua 复制代码
Person.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})

-- 要求两种方式都能成功创建对象。

Lua 复制代码
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 obj
end

local p = Person:new("p", 12)
local k = Person:new({name = "k", age = 12})

p:introduce()
k:introduce()
相关推荐
BuHuaX18 小时前
Lua 与 ToLua:运行机制及热更新原理
开发语言·unity·junit·c#·lua
努力努力再努力wz21 小时前
【Lua 入门系列】模块与包(一):从多文件组织到require 运行时加载机制、模块缓存、预加载搜索与 Lua 文件搜索机制
开发语言·junit·lua
UWA21 小时前
多人战斗中Lua持续高耗时,是瞬时峰值还是高频调用在作祟
性能优化·lua·游戏开发
努力努力再努力wz2 天前
【Lua 入门系列】从执行模型到事件驱动:一文理解 Lua 有栈协程、挂起恢复与协作式调度
开发语言·lua
努力努力再努力wz2 天前
【Lua 入门系列】Lua数据结构:从 Table 出发,一文串联数组、链表、栈、队列、集合、映射与树的实现原理
数据结构·链表·lua
努力努力再努力wz3 天前
【Lua入门系列】从 Table 到元表与元方法:一文理解 Lua 的行为扩展机制
开发语言·junit·lua
麻瓜code4 天前
秒杀优化三连:Lua + 阻塞队列 + Redis Stream,响应从 3.4 秒到毫秒级
redis·junit·lua
努力努力再努力wz4 天前
【Lua 入门系列】Lua 函数深入理解:函数对象、多返回值、可变参数、闭包、递归与尾调用优化
开发语言·lua
hey you~4 天前
云呼叫中心坐席自动分配实战:ACD 策略、Redis+Lua 实现与排查清单
数据库·redis·lua·云呼叫中心·acd·坐席分配·坐席状态机
我不会起名字3224 天前
Redis pipeline 用了反而更慢:3 类误用与正确的批量姿势
redis·pipeline·lua·rtt·批量