OO Lua - 如何停止访问基类表?

尝试在Lua中构建国际象棋时,遇到了棋子的问题。我有一个基础的“Piece”类,然后为每个棋子继承Piece类的类。我遇到了覆盖基类表的问题。创建一个对象后,当创建另一个对象时,它会覆盖表中的字段。

我的基类:

Piece = {
    killed = false,
    white = false,
    pieceName = nil
}

function Piece:new(white)
    local returnObject = {
        killed = false,
        white = false,
        pieceName = nil
    }
    setmetatable(returnObject, self)
    self.__index = self
    self.white = white
    return returnObject
end

function Piece:isWhite()
    return (self.white == true)
end

function Piece:setWhite(white)
    self.white = white
end

function Piece:isKilled()
    return (self.killed == true)
end

function Piece:setKilled(killed)
    self.killed = killed
end

function Piece:getName()
    return self.pieceName
end

function Piece:setName(name)
    self.pieceName = name
end

例如,车的类:


require "Piece"

Rook = Piece:new()

function Rook:canMove(board, startSpot, endSpot)
    if endSpot:getPiece():isWhite() == self.isWhite() then
        return false
    end
end

最后,我尝试在这些子类中的棋盘上调用new(它是包含一些棋子的2D Spot(即瓷砖)的2D表):

function Board:resetBoard()
    self.boxes[1][1] = Spot:new(1, 1, Rook:new(true))
    self.boxes[1][1]:getPiece():setName("Rook")
    self.boxes[1][5] = Spot:new(1, 5, King:new(true))
    self.boxes[1][5]:getPiece():setName("King")
    ...
end

我从打印棋盘得到的输出是:

King    0       0       0       King    0       0       0
0       0       0       0       0       0       0       0
0       0       0       0       0       0       0       0
0       0       0       0       0       0       0       0
0       0       0       0       0       0       0       0
0       0       0       0       0       0       0       0
0       0       0       0       0       0       0       0
0       0       0       0       0       0       0       0

我尝试了一些混乱的解决方法,但无法使任何事情正常工作。我觉得问题在于setName调用self.pieceName,但我不确定如何以这种方式设置一个setter。虽然这只是一个猜测,但可能是其他原因。

有什么想法吗?请随时提出更多信息。

点赞
用户7770819
用户7770819

已解决此问题,还需要使“Spot”也是唯一的。 我之前没有提到过“Spot”类,现在已更改代码如下:

Spot = {
    x = nil,
    y = nil,
    piece = nil
}

Spot.__index = Spot

function Spot:new(x, y, piece)
    local returnObject = {}
    setmetatable(returnObject, self)
    returnObject.x = x
    returnObject.y = y
    returnObject:setPiece(piece)
    return returnObject
end
2020-08-29 12:19:56