当前位置: 首页 > news >正文

Lua 面向对象编程

C#是一个典型的面向对象编程语言,我们可以参考C#来模拟实现Lua的面向对象编程

类和类的创建

Lua中的类是通过表来体现,可以将表当作一个类。

1、包含变量字段和方法。

C#

public class Animal
{public string name = "动物";public float height;public float weight;public void Say(){Console.WriteLine("动物叫声!");}
}

Lua

local Animal = {}Animal.name = "动物"
Animal.height = 0;
Animal.weight = 0;function Animal:Say()print("动物叫声!")
end

2、创建类对象

C#

Animal animal1 = new Animal();
animal1.name = "小狗";Animal animal2 = new Animal();
animal2.name = "小猫";Animal animal3 = new Animal();
animal3.name = "小鸟";

Lua

为了实现创建类对象,需要对Animal表进行调整

要求:

1、创建的对象(表)要独立。

2、创建的对象可以复用模板类中方法,借助lua中__index元方法的特性实现

3、模板类提供一个创建对象的接口(例如new方法)。

local Animal = {}Animal.name = "动物"
Animal.height = 0;
Animal.weight = 0;--创建对象方法
function Animal:new()local obj = {}setmetatable(obj,Animal)self.__index = selfobj.name = self.nameobj.height = self.heightobj.weight = self.weightreturn obj
endfunction Animal:Say()print(self.name,"叫声!")
endlocal animal1 = Animal:new()
animal1.name = "小狗"local animal2 = Animal:new()
animal2.name = "小猫"local animal3 = Animal:new()
animal3.name = "小鸟"animal1:Say()
animal2:Say()
animal3:Say()

3、实现构造函数

在创建对象时调用,传入参数,用于初始化对C#

C#

public class Animal
{public string name = "动物";public float height;public float weight;public Animal(string _name,float _height,float _weight) {name = _name;   height = _height;   weight = _weight;   }public void Say(){Console.WriteLine($"我是:{name} 身高:{height} 体重:{weight}");}
}Animal animal1 = new Animal("小狗",111,222);Animal animal2 = new Animal("小猫", 333, 444);Animal animal3 = new Animal("小鸟", 555, 666);animal1.Say();
animal2.Say();
animal3.Say();

Lua

local Animal = {}Animal.name = "动物"
Animal.height = 0;
Animal.weight = 0;--创建对象方法
function Animal:new(_name,_height,_weight)local obj = {}setmetatable(obj,Animal)self.__index = selfobj.name = _nameobj.height = _heightobj.weight = _weightreturn obj
endfunction Animal:Say()print(self.name,self.height,self.weight)
endlocal animal1 = Animal:new("小狗",111,222)
local animal2 = Animal:new("小猫",333,444)
local animal3 = Animal:new("小鸟",555,666)animal1:Say()
animal2:Say()
animal3:Say()

继承

先实现一个公共的类继承接口

--继承公共方法
--child:子类  parent:父类
local Inherit = function (child,parent)-- 设置新类的元表为父类,实现继承setmetatable(child,{__index = parent})-- 将父类保存下来,方便以后使用(例如调用父类方法)child.base = parent
end

单继承

类似于C#中,一个类只能继承一个基类

--子类
local list = {}--父类
local list1 = {name = "11"
}function list1:Say()print("Hello World!")
endInherit(list,list1)
list.num = 200
list:Say()print(list.name,list.base.name,list.num)

多继承

类似于C#中,一个类除了继承一个基类之外还可以继承多个接口。对应到Lua中,相当设置多个元表。但是Lua语法规定:一个表只能有一个元表。但可以通过一些方式来模拟类似的需求:

多个元表进行链接

--子类
local list = {}--父类1
local list1 = {value1 = "11"
}function list1:Say1()print("Hello World!  1")
end--父类2
local list2 = {value2 = "22"
}function list2:Say2()print("Hello World!  2")
end--父类3
local list3 = {value3 = "33"
}function list3:Say3()print("Hello World!  3")
endInherit(list1,list2)
Inherit(list2,list3)
Inherit(list,list1)print(list.value1)
print(list.value2)
print(list.value3)
list:Say1()
list:Say2()
list:Say3()

多态

C#中,多态性通过方法重载和方法重写实现。Lua 通过元表和 __index 可以很自然地实现重写。

--子类
local list = {}--父类1
local list1 = {value1 = "11"
}function list1:Say1()print("Hello World!")
end--让list继承list1
Inherit(list,list1)--添加list中Say1函数,相当于重写
function list:Say1()print("Good Morning")
endlist:Say1()
--打印 Good Morning

封装

定义:把对象的数据和操作代码组合在同一个结构中,这就是对象的封装性。

C#

1、使用访问修饰符(public、protected、private等)来控制成员的操作权限。

2、通过属性封装字段,方法封装操作逻辑,类封装变量、属性、方法等

Lua

1、使用local声明局部变量

2、使用表来封装变量和方法、方法封装操作逻辑


文章转载自:

http://u7LrxlQ6.qjbxt.cn
http://wMMhVJkV.qjbxt.cn
http://wcHTsuNk.qjbxt.cn
http://NSmpke8k.qjbxt.cn
http://x4xvU7bB.qjbxt.cn
http://84ulLVkS.qjbxt.cn
http://KOAypM1P.qjbxt.cn
http://My2jhadb.qjbxt.cn
http://fI8Bwyhv.qjbxt.cn
http://MXq4cgBt.qjbxt.cn
http://SBdo1SxY.qjbxt.cn
http://Amln1YL9.qjbxt.cn
http://PbRoJ0x4.qjbxt.cn
http://xyITcma4.qjbxt.cn
http://QhxPmGiK.qjbxt.cn
http://KbZfPhgn.qjbxt.cn
http://NsFbLyNr.qjbxt.cn
http://dacjKjot.qjbxt.cn
http://wEWDui6W.qjbxt.cn
http://OxL1rUyn.qjbxt.cn
http://Ey9eeFQ5.qjbxt.cn
http://FFBerB8c.qjbxt.cn
http://T1NPvkoJ.qjbxt.cn
http://qJ5d64qD.qjbxt.cn
http://TFIcJZff.qjbxt.cn
http://ZRr98TUZ.qjbxt.cn
http://eyR3O0hQ.qjbxt.cn
http://CXWyLwkA.qjbxt.cn
http://yU6zGlnj.qjbxt.cn
http://u8M7eOcr.qjbxt.cn
http://www.dtcms.com/a/370165.html

相关文章:

  • 微信小程序(uniapp)实现连接蓝牙
  • 从 scheduler_tick 到上下文切换:深入解析 Linux 内核的 TIF_NEED_RESCHED 标志设置流程
  • 微前端框架性能对比与选型指南:从理论到实践
  • pyAutoGUI 模块主要功能介绍-(1)鼠标功能
  • Maven的介绍及基本使用
  • 使用 C# .NETCore 实现MongoDB
  • 2025年渗透测试面试题总结-55(题目+回答)
  • %前置模糊查询优化
  • 【架构艺术】变更风险防控架构嵌入决策降噪模块的方法
  • ElmentUI之DateTimePicker 日期时间选择器
  • RabbitMQ 入门与 Go 语言实践
  • [Upscayl图像增强] Electron主进程命令 | 进程间通信IPC
  • 80(HTTP默认端口)和8080端口(备用HTTP端口)区别
  • AI模型测评平台工程化实战十二讲(第一讲:从手工测试到系统化的觉醒)
  • FreeMarker快速入门指南
  • python的数据结构
  • Spark 中spark.implicits._ 中的 toDF和DataFrame 类本身的 toDF 方法
  • 基于Spark的中文文本情感分析系统研究
  • 《用 asyncio 构建异步任务队列:Python 并发编程的实战与思考》
  • Python+DRVT 从外部调用 Revit:批量创建梁(2)
  • 数据库原理及应用_数据库管理和保护_第5章数据库的安全性_理论部分
  • 开源OpenHarmony润开鸿HH-SCDAYU800A开发板开箱体验
  • 第27节:3D数据可视化与大规模地形渲染
  • 《云原生故障诊疗指南:从假活到配置漂移的根治方案》
  • illustrator插件大全 免费插件介绍 Ai设计插件集合 (5)
  • Kubernetes (k8s)
  • 交叉编译器介绍
  • 2025最新超详细FreeRTOS入门教程:第二章 FreeRTOS任务创建
  • Webpack热更新(HMR)底层原理详解
  • repo 学习教程