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

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

-- 方法:introduce(),输出 "My name is <name>, I am <age> 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 obj
endfunction 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) thenself.age = ageelseprint("[Warning] Invalid age value, defaulting to 0.")end
end

-- 题目 2:类中添加私有方法(模拟私有函数)

-- 在 Person 类中,添加一个私有函数 calculateBirthYear(currentYear),根据年龄推算出生年份。

-- 在 introduce() 中调用它,输出内容增加一句:"I was born in <year>."

-- 提示:Lua 本身没有私有函数机制,但可以通过 local 函数模拟。

local function calculateBirthYear(self, currentYear)return currentYear - self.age
endfunction 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 <name>, I am <age> years old.

-- I study at <school>.

-- 同时添加方法 study(subject),输出:"<name> is studying <subject>."

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
endfunction 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() 输出:"<name> is teaching <subject>."

-- 并重写 introduce() 输出:

-- My name is <name>, I am <age> years old.

-- I teach <subject>.

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
endfunction 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) doperson:introduce()end
endlocal 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 false
endprint(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" thenfor i,v in pairs(nameOrTable) doobj[i] = vendelseif type(nameOrTable) == "string" thenobj.name = nameOrTableobj.age = ageendsetmetatable(obj,self)return obj
endlocal p = Person:new("p", 12)
local k = Person:new({name = "k", age = 12})p:introduce()
k:introduce()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92048.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92048.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92048.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SAP PP CK466

原因 作业价格没有维护 解决方案 KP26

如何解决pip安装报错ModuleNotFoundError: No module named ‘keras’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘keras’问题 摘要 在使用 PyCharm 进行深度学习项目开发时&#xff0c;常常需要通过 pip install keras 来安装 Keras 库。但有时即便命令执行成功&#xff0c…

人工智能领域、图欧科技、IMYAI智能助手2024年全年历史更新大事件汇总

2024年 2024年12月29日 【通知】 1、主站导出文档功能优化升级&#xff0c;新增支持了纯文本WORD导出功能&#xff0c;支持使用WPS软件打开 注&#xff1a;原来的富文本WORD不支持使用WPS打开&#xff0c;只支持系统自带的WORD软件打开&#xff0c;比如Microsoft Office Word 2…

UWB实操:使用UCI CMD测距;UCI CMD是一串数字,创建测距session,配置测距session,开始测距session。

使用UCI CMD测距; UCI CMD是一串数字,创建测距session,配置测距session,开始测距session。根据 FiRa_UCI_Technical_Specification,我们可以分析并组织测距cmd 例如: Fira2.0 1v1 发起 DSTWR 创建测距session:210000052222222200 配置测距session: 2103001F222…

从AUTOSAR角度理解CAN以及CANFD

一、AUTOSAR对CAN和CAN FD的基础定位 CAN&#xff1a;基于传统CAN 2.0B协议&#xff0c;是AUTOSAR早期版本&#xff08;如4.0.3及之前&#xff09;的核心车载通信协议&#xff0c;支持最大8字节 payload&#xff0c;仲裁段波特率通常≤1Mbps&#xff0c;适用于低带宽、高实时性…

第27章:服务部署与容器化

1. 课程引言 在前面的章节中&#xff0c;我们已经完成了电商项目核心服务的开发。然而&#xff0c;开发完成只是项目生命周期的一部分&#xff0c;如何将这些服务高效、可靠地部署到生产环境&#xff0c;是决定项目成败的关键一步。本章将聚焦于服务的部署&#xff0c;重点介绍…

力扣148:排序链表

力扣148:排序链表题目思路代码题目 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 思路 当我们第一眼看见这道题时心中其实是有思路的&#xff0c;我们不想这是个链表就当它是一个整型数组。那么自然而然就会想到各种各样的排序方法&#xf…

基于k8s环境下的pulsar常用命令(下)

#作者&#xff1a;Unstopabler 文章目录permissionSchemapermission pulsar的权限控制是在namespace级别的 kubectl exec pulsar-toolset-0 -n pulsar – bin/pulsar-admin namespaces grant-permission mytenant/mynamespace –actions produce,consume –role admin10 注…

2.4 组件通信

Props 和 Events&#xff08;父子组件通信&#xff09;Props&#xff1a;父组件向子组件传递数据使用 props。子组件通过声明 props 来接收来自父组件的数据。<!-- 父组件 --> <template><ChildComponent :message"parentMessage" /> </templat…

PCL学习之路-基础知识-(一)

文章目录1.西门子S7系列PLC类型划分(1).大型PLC&#xff1a;S7-400(2).中型PLC&#xff1a;S7-300(3).小型PLC&#xff1a;S7-200系列2.西门子S7外形结构(1).总览&#xff1a;PLC的“器官”分工逻辑3.输出电路(1).小型继电器输出形式(2).大功率晶体管/场效应管输出形式(3).双向…

leetcode654:最大二叉树(递归与单调栈双解法)

文章目录一、 题目描述二、 核心思路&#xff1a;分而治之与递归构造三、代码实现与深度解析四、 关键点与复杂度分析五、拓展解法单调栈解法两种解法对比LeetCode 654. 最大二叉树&#xff0c;【难度&#xff1a;中等&#xff1b;通过率&#xff1a;82.6%】&#xff0c;这道题…

Python 循环语法详解

在编程中&#xff0c;循环是一种非常常见的控制结构。很多时候&#xff0c;我们需要重复做一些事情&#xff0c;比如遍历列表、处理数据、尝试直到成功等。这时候&#xff0c;就离不开循环了。Python 提供了两种主要的循环结构&#xff1a;for 循环 和 while 循环。本篇文章会从…

一个小巧神奇的 USB数据线检测仪

一个小巧的数据线检测仪&#xff0c;检测各种USB数据线是否损坏、通断&#xff0c;TYPE_C、MICRO_B、苹果线、烧录线、网线都可检测。嵌入式开发者的称手工具。 这个是我个人制作的&#xff0c;SMT和连接器比较贵&#xff0c;特别是24PIN的C口连接器&#xff0c;我挂在黄色小鱼…

37.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--增加Github Action

在第二部分&#xff08;微服务基础工具与技术&#xff09;中我们讲解了GitHub Action的相关知识&#xff0c;那么在这一节中&#xff0c;我们将为已有的微服务增加GitHub Action的支持。 一、什么是GitHub Action 虽然前面已经介绍过GitHub Action的相关知识&#xff0c;但这里…

ROS2 通过 命令行 发布速度控制指令 控制 麦克娜姆轮

在 ROS2 中&#xff0c;要通过命令行发布速度控制指令来控制麦克娜姆轮机器人&#xff0c;你需要知道机器人所使用的速度控制话题和消息类型。通常麦克娜姆轮机器人使用geometry_msgs/Twist消息类型来接收速度指令。 以下是通过命令行发布速度控制指令的方法&#xff1a; 首先确…

多层Model更新多层ListView

一、总体架构QML (三层 ListView)└─ C 单例 DataCenter (QQmlContext 注册)├─ L1Model (一级节点)│ └─ 内部持有 QList<L2Model*>│ └─ L2Model (二级节点)│ └─ 内部持有 QList<L3Model*>│ └─ L3Model (三级节…

Git基础操作教程

本文目的是掌握Git基础操作教程一、Git简介Git&#xff1a;分布式版本控制系统&#xff0c;使用仓库(Repository)来记录文件的变化最流行的版本控制系统有两种&#xff1a;集中式&#xff08;SVN&#xff09;、分布式&#xff08;Git&#xff09;二、Git操作1.创建仓库仓库(Rep…

Android 之 Kotlin

变量变量的声明Kotlin使用var&#xff0c;val来声明变量&#xff0c;注意&#xff1a;Kotlin不再需要;来结尾var 可变变量&#xff0c;对应java的非final变量var b 1val不可变变量&#xff0c;对应java的final变量val a 1两种变量并未声明类型&#xff0c;这是因为Kotlin存在…

Design Compiler:布图规划探索(ICC)

相关阅读 Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 简介 在Design Compiler Graphical中&#xff0c;可以用布图规划探索(Floorplan Exploration)功能&#xff0c;打开IC Compiler进行布图规划的创建、修改与分…

《蓝牙低功耗音频技术架构解析》

《2025GAS声学大讲堂—音频产业创新技术公益讲座》低功耗蓝牙音频系列专题LE Audio & Auracast™专题讲座第1讲将于8月7日周四19点开讲&#xff0c;本次邀请了蓝牙技术联盟 技术与市场经理 鲁公羽 演讲&#xff0c;讲座主题&#xff1a;《蓝牙低功耗音频技术架构解析》。&…