Gigabait
Gigabait

Reputation: 49

How to inherit method?

I want to inherit method "GetName" or other methods from "Create" for "CreateInherited" and i want save unique methods from "CreateInherited" (like "GetInheritName"), but i dont know how.

My test code:

local MainTbl = {}

function MainTbl:Create(name)
    local tbl = {}
    tbl.name = name or 'Null'
  
    function tbl:GetName()
        return self.name
    end

    setmetatable(tbl, self)
    self.__index = self
    return tbl
end

function MainTbl:CreateInherited(name)
    local tbl = {}
    tbl.name = name or 'Null'

    function tbl:GetInheritName()
        return self.name
    end

    setmetatable(tbl, self)
    self.__index = self
    return tbl
end

local Man = MainTbl:Create('Man')
local Woman = MainTbl:CreateInherited('Woman')

print(Man:GetName())
print(Woman:GetName())
print(Woman:GetInheritName())

Upvotes: 0

Views: 50

Answers (1)

luther
luther

Reputation: 5554

If I understand you, you're trying to put two different constructors into a single class. Notice that Create does most of the work that CreateInherited needs to do, so you can save yourself a lot of repeated code by calling Create inside CreateInherited. Instead of starting with an empty table, you can start with a fully formed instance from Create and add a method to it.

function MainTbl:CreateInherited(name)
    local tbl = self:Create(name)

    function tbl:GetInheritName()
        return self.name
    end

    return tbl
end

Upvotes: 2

Related Questions