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

问题描述

试图在Lua中构建国际象棋,但棋子有问题。我有一个基本的“ Piece”类,然后是一个继承每个作品的Piece类的类。我在覆盖基类表时遇到问题。创建一个对象,然后在创建另一个对象时,它将覆盖表中的字段。

我的基础班:

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

function Piece:new(white)
    local returnObject = {
        killed = 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


Rook类,例如:


require "Piece"

Rook = Piece:new()

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

最后,我尝试在电路板上的这些子类中调用new(这是2D斑点表(即图块),其中包含一块或0:

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,但是我不确定如何以这种方式设置设置器。但这只是一个猜测,可能还有其他原因。

有什么想法吗?请随时询问更多信息。

解决方法

解决了问题,归结为“ Spot”也需要唯一。更改了我之前未提到的Spot类,从:

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

Spot.__index = Spot

function Spot:new(x,y,piece)
    local returnObject = {}
    setmetatable(returnObject,self)
    self.x = x
    self.y = y
    self:setPiece(piece)
    return returnObject
end

收件人:

Spot = {
    x = nil,self)
    returnObject.x = x
    returnObject.y = y
    returnObject:setPiece(piece)
    return returnObject
end