使用继承的简便方法?

EDIT 我在 lua 中找到了一种更简单的方法,但是继承方法有问题

基本上,语法应该是这样的

Object

object       = {}
object.base  = ?
object.value = 0

function object:create(x, y)
    local copy

    --复制表
    if type(self) == "table" then
        copy = {}  for k, v in pairs(self) do copy[k] = v:create() end
    else
        copy = self
    end

    --设置基础
    copy.base = self

    --设置复制 vars
    copy.x = x
    copy.y = y

    return copy
end

function object:update()
    self.value = self.value + 1
end

Player

player       = object:create()
player.value = 1

function player:create(x, y, size)
    base:create(x, y) --继承基础事件
end

--因为没有重新声明,自动继承更新事件

我不确定如何做到这一点

点赞
用户1190388
用户1190388

你正在直接引用 base,而它实际上是你的 player 对象的一个属性:

function player:create(x, y, size)
    self.base:create(x, y)
end
2018-02-01 11:46:17
用户7253993
用户7253993

Lua 中的继承基本上使用 元表 实现。在代码中:

function object:new (o)
      o = o or {}
      -- 将创建方法的其余代码放在这里
      setmetatable(o, self)
      self.__index = self
      return o
    end

function object:update()
    self.value = self.value + 1
end

现在创建一个空的 Player class,它将是你基本的 Object class 的子类,并从它那里继承所有的行为。

Player = Object:new()

Player 现在是 Object 的一个实例。为了从 Object 继承 new 方法,实例化一个新的 Player 对象 p

p = Player:new{x=1, y=2, size=3}

然而,当 new 执行时,self 参数将引用 player。因此,p 的元表将是 Player,其值在索引 __index 处也是 Player。因此,pPlayer 继承,PlayerObject 继承。

现在当你编写:

p:create{x=10, y=20, size=100}

当 Lua 找不到 p 中的 create 字段时,它将查找 Player 类;它也找不到 create 字段,所以它会查找 Object,并在那里找到 create 的原始实现。update 函数也会发生相同的事情。

当然, Player 类可以重新定义从其超类 Object 继承的任何方法。例如,你可以重新定义 create 函数:

function Player:create()
   -- New create code for Player
end

现在当你调用 p:create{x=10, y=20, size=190},Lua 将不会访问 Object 类,因为它会首先在 Player 中找到新的 create 函数。

2018-02-02 09:19:48