Lua 中元方法的继承

2023-11-22

我非常喜欢“programming in lua”16.1, 16.2 中如何描述面向对象编程:

http://www.lua.org/pil/16.1.html

http://www.lua.org/pil/16.2.html

并愿意遵循这种方法。但我想更进一步:我想要一个名为“class”的基“类”,它应该是所有子类的基础,因为我想在那里实现一些辅助方法(如“instanceof”等) .),但本质上应该是书中描述的那样:

function class:new(o)
    o = o or {}
    setmetatable(o, self)
    self.__index = self
    return o
end

现在我的问题:

我想要一个类“number”,它继承自“class”:

number = class:new()

我想在此类中定义运算符重载的元方法(__add、__sub 等),例如:

n1 = number:new()
n2 = number:new()

print(n1 + n2)

作品。这并不是真正的问题。但现在我想要第三类“money”,它继承自“number”:

money = number:new{value=10,currency='EUR'}

我在这里介绍一些新的属性等等。

现在我的问题是,我没有让事情正常工作,“钱”继承了“类”和“数字”的所有方法包括“number”中定义的所有元方法。

我已经尝试了几件事,例如覆盖“new”或修改元表,但我无法让事情正常工作,而不会丢失“money”中“class”的方法或丢失“money”中“number”的元方法

我知道,有很多类实现,但我真的很想坚持使用 lua 本身的最小方法。

任何帮助将非常感激!

非常感谢!


我认为您遇到的问题是由于使用类似于以下内容的方式查找运算符元方法rawget(getmetatable(obj) or {}, "__add")。因此,运算符不会与其他函数一起继承。

我已经取得了一些成功new函数复制运算符,如下所示:

function class:new(o)
    o = o or {}
    setmetatable(o, self)
    self.__index = self
    local m=getmetatable(self)
    if m then
        for k,v in pairs(m) do
            if not rawget(self,k) and k:match("^__") then
                self[k] = m[k]
            end
        end
    end
    return o
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lua 中元方法的继承 的相关文章

  • 抽象方法实现与抽象方法重写。这两个对于抽象类意味着相同吗?

    我几乎要采取Java SE 8 程序员我 exam 1Z0 808 我正在使用这个学习指南 https www selikoff net java oca 8 programmer i study guide https www selik
  • 从父类的List中提取子类元素

    我目前有一个这样的列表 List
  • 继承属性,从 readonly 继承的属性中读写时不会合成 setter

    我在使用属性时发现了一个奇怪的行为 该属性被继承为只读 然后在继承的类中重新声明为读写 In A h interface A NSObject property nonatomic strong readonly NSObject some
  • 使用抽象类作为模板类型

    我对c 还是很陌生 来自java 我有一个 stl 类型列表Actor When Actor仅包含 真实 方法就没有问题 我现在想将这个类扩展到几个类 并且需要将一些方法更改为抽象的 因为它们不再具有具体的意义 正如我 从文档中 预期的那样
  • 为什么/何时应该使用泛型方法?

    学习Java的时候遇到过通用方法 public
  • 与运算符<<(操作数类型std::ostream)C++ OOP和Point不匹配[重复]

    这个问题在这里已经有答案了 我试图显示我通过成员函数创建的 Point 类的 p 对象 我已将 Point p 作为参数传递给我的程序的 void displayPoint Point p 成员函数 但我的程序中出现以下编译错误 D OOP
  • 但是创建静态实用方法不应该被过度使用吗?如何避免呢? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 随着时间的推移 java项目中引入了许多实用方法来完成更复杂和简单的任务 当使用静态方法时 我们在代码中引入了紧密耦合 这使得我们的代
  • 如何在 Python 中创建对象的副本?

    我想创建一个对象的副本 我希望新对象拥有旧对象的所有属性 字段的值 但我想要有独立的对象 因此 如果我更改新对象的字段值 旧对象不应受到影响 要获得对象的完全独立的副本 您可以使用copy deepcopy http docs python
  • PHP:我是否将事件驱动编程与信号感知接口(信号和槽/观察者模式)混淆了?

    我看到很多人说 Symfony2 Zend Framework 2 等都是事件驱动的 在桌面世界中 通过事件驱动编程 我了解到应用程序每当其状态发生变化时都会通知其观察者 由于 PHP 应用程序是无状态的 因此无法执行此类操作 IE 让观察
  • Python:如何“杀死”类实例/对象?

    我希望 Roach 类在达到一定量的 饥饿 时 死亡 但我不知道如何删除该实例 我的术语可能有误 但我的意思是 窗户上有大量 蟑螂 我希望特定的蟑螂完全消失 我会向您展示代码 但它很长 我将蟑螂类添加到策划者类蟑螂种群列表中 一般来说 每个
  • 通过setter设置继承的属性

    我有这个代码 Vehicle object constructor function Vehicle this wheels 4 Adding setWheels setter function to set wheels property
  • 如何正确使用状态模式?

    在我的编程经验中 我遇到过一些状态模式的实现 并且完成了一些 我见过它们在各种场景中使用 主要是 UI 和解析 问题在于 所有这些在快速开发的压力下都变成了难以维护和理解的代码块 我正在考虑重构其中之一 但我无法在网上找到合适的资源 网上有
  • 值类型如何实现引用类型

    我遇到了一个值类型正在实现 ref 的场景 类型 只是想知道这怎么可能 幕后发生了什么 结构体是值类型 接口是引用 类型但结构可以实现接口而不会出现任何错误 有什么想法吗 提前致谢 实际上 它同时以两种不同的方式进行 首先 任何值类型都可以
  • 为二叉树实现 IntoIterator

    我正在尝试构建一棵二叉树并编写一个迭代器来遍历树中的值 当为我的树节点实现 IntoIterator 特征时 我遇到了生命周期问题 src main rs 43 6 43 8 error the lifetime parameter a i
  • 有没有办法从包含类名的字符串实例化对象?

    我有一个文件 Base h class Base class DerivedA public Base class DerivedB public Base etc 和另一个文件 BaseFactory h include Base h c
  • Python 中的 @staticmethod 与 @classmethod

    方法和方法有什么区别装饰的 https peps python org pep 0318 with staticmethod http docs python org library functions html staticmethod和
  • 在 javascript 原型事件处理程序中保留“this”引用[重复]

    这个问题在这里已经有答案了 正确的保存方法是什么this存储在对象原型内的事件处理程序中的 javascript 引用 我不想创建像 this 或 that 这样的临时变量 而且我不能使用像 jQuery 这样的框架 我看到很多人谈论使用
  • 从模块中获取类名

    如何从模块中获取该模块包含的类的类名 module ActMethods def some method attr names cls self class this doesn t work end end 如何进入 cls 变量 加载此
  • “单体”是什么意思?

    我在课堂上看到过它 我怀疑这意味着该类可以被分解为逻辑子单元 但我找不到一个好的定义 你能举一些例子吗 谢谢您的帮助 编辑 我喜欢聪明的回复 但我显然指的是软件上下文中的 整体 我了解巨石 巨石 支石墓以及所有与石头相关的背景 哎呀 我的国
  • 克隆一个lua状态

    最近 我在使用C 和Lua进行开发时遇到了很多困难 我的情况是 由于某种原因 我的 C 程序中可能有数千个 Lua 状态 但这些状态在初始化后应该是相同的 当然 我可以为每个状态执行 luaL loadlibs 和 lua loadfile

随机推荐