Lua中元方法的继承

aur*_*ora 6 oop inheritance lua

我非常喜欢在"lua编程"16.1,16.2中描述面向对象编程的方式:

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

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

并希望遵循这种方法.但我想更进一步:我希望有一个称为"类"的基类"类",它应该是所有子类的基础,因为我想在那里实现一些辅助方法(如"instanceof"等) .),但基本上它应该如书中所述:

function class:new(o)
    o = o or {}
    setmetatable(o, self)
    self.__index = self
    return o
end
Run Code Online (Sandbox Code Playgroud)

现在我的问题:

我想有一个类"数字",它继承自"类":

number = class:new()
Run Code Online (Sandbox Code Playgroud)

我想在这个类中为运算符重载(__add,__sub等)定义元方法,所以类似于:

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

print(n1 + n2)
Run Code Online (Sandbox Code Playgroud)

作品.这不是一个真正的问题.但现在我想要第三类"钱",它继承自"数字":

money = number:new{value=10,currency='EUR'}
Run Code Online (Sandbox Code Playgroud)

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

现在我的问题是,我没有工作,"钱"继承了"类"和"数字"的所有方法,包括 "数字"中定义的所有元方法.

我已经尝试了一些事情,比如覆盖"新"或修改元数据,但我无法让事情发挥作用,既没有放弃"钱"中"阶级"的方法,也没有放弃"钱"中"数字"的元方法

我知道,那里有很多类的实现,但我真的很想坚持lua本身的最小方法.

任何帮助将非常感谢!

非常感谢!

gwe*_*ell 5

我认为您遇到的问题是由于使用类似于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
Run Code Online (Sandbox Code Playgroud)