具有继承的类简化方式?

时间:2018-02-01 02:10:14

标签: class inheritance lua

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

基本上语法会像这样

对象

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

function object:create(x, y)
    local copy

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

    --set base
    copy.base = self

    --set copy vars
    copy.x = x
    copy.y = y

    return copy
end

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

播放器

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

function player:create(x, y, size)
    base:create(x, y) --inherit base event
end

--automaticly inherits update event since it is not redeclared

我不知道如何做到这一点

2 个答案:

答案 0 :(得分:1)

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

function object:new (o)
      o = o or {}
      -- Put the rest of your create function code here
      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的一个实例。实例化一个新的Player对象p,以便从new继承Object方法。

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

但是,这一次,new执行时,self参数将引用player。因此,p的元格将为Player,其索引__index的值也为Player。因此,p继承自Player,继承自Object

现在你要编码:

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

lua在create中找不到p字段,因此它会查看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课程,因为它首先会在create中找到新的Player功能。

答案 1 :(得分:0)

您正在直接引用base,而实际上它是您的玩家对象的属性:

function player:create(x, y, size)
    self.base:create(x, y)
end