• Conceitos de P.O.O

Clique sobre os tópicos listados abaixo para navegar até o conteúdo desejado.

  1. Herança
  2. Construtor classe pai/base
  3. Métodos Get e Set
  4. Sobrescrita de método
  5. Identificar tipo de classe com issubclass
  6. Herança múltipla

O conceito de herança em POO permite que uma classe filha tenha acesso aos recursos da classe pai e também possa estendê-la.

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()
    return pai
end

--instância
local objeto = filha.construtor()
objeto.MetodoPai()
print(objeto.PropriedadePai);
Saída
pai.MetodoPai
999

Em algumas situações é necessário iniciar uma classe pai com valores. Para tal, criamos um construtor parametrizado nessa classe:

Exemplo 3
local pai = {} --table

--construtor público
pai.construtor = function(valor)
    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 filha = {}

filha.construtor = function() --parametros classe filha omitidos
    local pai = pai.construtor(888)
    return 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 = {} --table

--construtor publico
pai.construtor = function(valor)
    local classe = {} 
    
    classe.PropriedadePai = valor --public
    
    function classe.MetodoPai()
        print("pai.MetodoPai")
    end
    
    return classe
end


local 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.

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()
        return propriedadePai
    end
    
    this.SetPropriedadePai = function(valor)
        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())
        this.SetPropriedadePai(888)
        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= {} --table

--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
  1. 14/06/2025 - versão inicial