Leitura recomendada
    
    
    
        
Objetivos
        
    
    
    
        
Herança
    
    
        
            
                O conceito de herança em P.O.O permite que uma classe filha tenha acesso aos recursos 
                da classe pai e também possa estendê-la.
            
            
                No exemplo abaixo, vamos criar uma table pai que retorna suas propriedades e métodos para 
                ser herdada por uma classe filha.
            
            Exemplo 1
            
local pai= {} --table
--construtor público
pai.construtor = function()
    local classe = {} 
    classe.MinhaPropriedade = 999 --public
    
    function classe.MetodoClasseBase()
        print("MinhaClasse.MetodoClasseBase")
    end
    return classe
end
            Saída
            
-
            
                Vamos simular herança instanciando uma classe pai dentro de uma classe filha para assim ter 
                acesso aos métodos e atributos da classe pai.            
            
            Exemplo 2
            
local filha= {}
filha.construtor = function()
    local pai= MinhaClasse.construtor()
    return pai
end
            
                O uso da classe derivada para acessar os métodos e atributos da classe pai é mostrado no 
                exemplo abaixo:           
            
            Exemplo 2
            
local pai = {} --table
--construtor público
pai.construtor = function()
    local classe = {} 
    classe.PropriedadePai = 999 --public
    
    function classe.MetodoPai()
        print("pai.MetodoPai")
    end
    return classe
end
local filha = {}
filha.construtor = function()
    local pai = pai.construtor() --classe pai
    return pai
end
--instância
local objeto = filha.construtor()
objeto.MetodoPai()
print(objeto.PropriedadePai);
            Saída
            
pai.MetodoPai
999
         
     
    
        Método construtor classe pai/base
        
     
    
        
            
                Em algumas situações é necessário iniciar uma classe pai com valores. Para tal, criamos um 
                construtor parametrizado nessa classe:
            
            Exemplo 3 
            
local pai = {} --classe pai
--construtor público
pai.construtor = function(valor) --parâmetros
    local classe = {} 
    
    classe.PropriedadePai = valor --public
    
    function classe.MetodoPai()
        print("pai.MetodoPai")
    end
    
    return classe
end
            Saída
            
pai.MetodoPai
888
            
                A classe filha agora pode informar os valores como argumento para o construtor ao instanciar 
                a classe pai.
            
            Sintaxe
            
local classe_filha = {}
classe_filha.construtor = function() --parametros classe filha omitidos
    local classe_pai = classe_pai.construtor(<parametros>)
    return classe_pai
end
            
                O uso da classe derivada para acessar os métodos e atributos da classe pai, usando o que 
                foi discutido neste tópico, é mostrado no exemplo abaixo:
            
            Exemplo 4 
            
local pai = {} -- classe pai
--construtor publico
pai.construtor = function(valor)
    local classe = {} 
    
    classe.PropriedadePai = valor --public
    
    function classe.MetodoPai()
        print("pai.MetodoPai")
    end
    
    return classe
end
local filha = {} --classe filha
filha.construtor = function()
    local pai = pai.construtor(888)
    return pai
end
--instancia
local objeto = filha.construtor()
objeto.MetodoPai()
print(objeto.PropriedadePai);
            Saída
            
pai.MetodoPai
888
         
     
    
    
        
            
                De forma semelhante ao que foi visto acima, podemos acessar os métodos get/set de uma classe 
                pai a partir de sua classe filha.  O termo this utilizado no exemplos faz referência 
                à própria classe simulando o this em linguagens O.O.
            
            Exemplo 5 
            
--classe pai
local pai= {} --table
--construtor público
pai.construtor = function() --
    local this = {} 
    local propriedadePai = 999 --private
    
    function this.MetodoPai()
        print("pai","MetodoPai")
    end
    
    this.GetPropriedadePai = function() --Get
        return propriedadePai
    end
    
    this.SetPropriedadePai = function(valor) --Set
        propriedadePai = valor
    end
    return this
end
--classe filha
local filha= {}
filha.construtor = function()
    local this = pai.construtor() --construtor pai
    
    this.MetodoFilha = function()
        print(this.propriedadePai) --nil
        print(this.GetPropriedadePai()) --get pai
        this.SetPropriedadePai(888) --set pai
        print(this.GetPropriedadePai())
    end
    return this
end
--instância
local objeto = filha.construtor(888) --construtor
objeto.MetodoFilha()
            Saída
            
999
            
            
         
     
    
    
        
            
                A sobrescrita de métodos em O.O permite que um mesmo método tenha diferentes implementações. 
                Para simular essa sobrescrita, vamos definir um método para sobrescrever em uma classe pai:
            
            Exemplo 6 
            
local pai= {} --classe pai
--construtor publico
pai.construtor = function()
    local this = {} 
    function this.Sobrescrever() -- override
        print("Metodo pai")
    end
    return this
end
            
                O uso dos métodos sobrescrita na classe pai é mostrado no código completo abaixo:
            
            Exemplo 7 
            
local pai= {} --table
--construtor publico
pai.construtor = function() --construtor 
    local this = {} 
    function this.Sobrescrever() -- override
        print("Método pai")
    end
    return this
end
local filha= {}
filha.construtor = function()
    local pai= pai.construtor() --construtor base
    
    local metodoBase = pai.Sobrescrever --cópia se necessário
    
    function pai.Sobrescrever() --sobrescrita
        print("Método filha");
    end
    return pai
end
local _pai = pai.construtor()
local _filha = filha.construtor()
_filha.Sobrescrever()
_pai.Sobrescrever()
            Saída
            
Método filha
Método pai
         
     
    
        Histórico de atualizações
        
     
    
        
            
                - 15/09/2025 - revisão 1 - Ajustes: pontuais
 
                - 14/06/2025 - versão inicial
 
            
         
     
    
            
            
                
                    
                    Os cursos oferecidos nesta página são cursos fornecidos por parceiros. Ao comprar um curso clicando
                em seu banner, você está ajudando a manter o projeto TutorialDev vivo. Os sites dos cursos parceiros utilizam cookies.