Lua面向对象编程-类的多实例被忽略,为什么?

我有一个叫做"Edit"的类

function Edit:new(x,y,w,h,text,fnt)
    o = {}
    setmetatable(o,EditMt)
    self.__index = self
    self.x = x or 0
    self.y = y or 0
    self.width = w or 10
    self.height = h or 10
    self.text = text or ""
    self.active = false
    self.font = fnt or font
    self.yo = -(self.height - self.font:getHeight()) / 2
    return o
end

而这个类有一个叫做draw的函数(用Löve2d创建)

function Edit:draw(  )
    if self.active then
        love.graphics.setColor(255,255,255,255)
     love.graphics.rectangle("fill",self.x,self.y,self.width,self.height)
        love.graphics.setColor(0,0,0,255)
        love.graphics.printf(self.text,self.font,self.x,self.y,self.width, "center",0,1,1,0,self.yo)
    else
        love.graphics.setColor(255,255,255,255)
        love.graphics.rectangle("line",self.x,self.y,self.width,self.height)
        love.graphics.printf(self.text,self.font,self.x,self.y,self.width, "center",0,1,1,0,self.yo)
    end
end

在我的主程序中,我创建了两个实例

edit1 = Edit:new(10,10,60,50,"1")
edit2 = Edit:new(80,10,60,50,"2")

在回调函数中绘制它们

function love.draw( )
    edit1:draw()
    edit2:draw()
end

但只绘制了edit2? 如果我交换绘制它们的位置,它仍然只绘制edit2,但是如果我在创建它们时交换它们的位置,它现在只绘制edit1?

点赞
用户2858170
用户2858170

这是初学者在 Lua 中学习面向对象编程时最常见的错误。

你把所有这些值赋给了 self,但如果你想要更改实例,你需要将它们赋给 o

否则,每次调用 Edit.new 都会覆盖这些值。

第二个问题是,你的实例 o 是全局的。你需要将它变为本地的!否则,每次都会覆盖你的实例。

 function Edit:new (x,y,w,h,text,fnt)
      local o = {}
      setmetatable(o, self)
      self.__index = self
      o.x = x or 0
      o.y = y or 0
      -- and so forth
      return o
    end

阅读这个:

https://www.lua.org/pil/16.html

http://lua-users.org/wiki/ObjectOrientedProgramming

2021-03-26 08:22:13
用户12918181
用户12918181

你在new函数中初始化对象时不是很正确。

new函数中,你初始化了对象和self,并且self是你的元表。

另一个问题是你创建了全局对象o

因此,你的new函数应该是这样的:

function Edit:new(x,y,w,h,text,fnt)
    local o = {}
    setmetatable(o, self)
    self.__index = self
    o.x = x or 0
    o.y = y or 0
    o.width = w or 10
    o.height = h or 10
    o.text = text or ""
    o.active = false
    o.font = fnt or font
    o.yo = -(o.height - o.font:getHeight()) / 2
    return o
end
2021-03-26 08:28:15