Notas de estudo da Lua orientada a objetos

índice

1. Introdução ao blog

2. Conteúdo

(1) Herança

(2) Herança múltipla

3. Empurre

4. Conclusão


 

1. Introdução ao blog

Este blog é uma das notas de estudo de Lua, introduzindo o conteúdo relacionado a objetos orientados a Lua. Este blog implementará herança e herança múltipla por meio de alguns pequenos exemplos. Para visualizar este blog, você precisa ter um entendimento relevante da metatabela de Lua. Você pode pular para este blog. Publique novamente artigos relacionados na metatabela do blogger, com um portal na parte inferior da postagem do blog.


2. Conteúdo

(1) Herança

Depois de entender a metabela, sabemos que quando a tabela B é a metabela da tabela A, quando chamamos o método ou atributo da tabela A, se não conseguirmos encontrá-lo, iremos para o metamétodo __index da tabela B para continuar pesquisando propriedades ou métodos relacionados, então encontramos a ideia de herança, primeiro escrevemos uma tabela de classe pai da seguinte maneira:

local Parent = {}

function Parent:new()
	local proxy = {}
	self.__index = self
	setmetatable(proxy,self)
	return proxy
end

function Parent:print(str)
	print("父类输出:"..str)
end

O código acima é muito simples. Temos uma tabela Parent como classe pai. Escrevemos um método new () para o Pai. O foco do método é self .__ index = self. Esta operação aponta o metamétodo __index do pai para o Parent A vantagem de fazer isso é que se o Parent for usado como a meta-tabela de outras tabelas, os atributos e métodos relevantes serão encontrados diretamente no Parent, porque o __index do Parent aponta para si mesmo, e então usamos o Parent como a meta-tabela da tabela de proxy e Passando proxy como o valor de retorno, vamos dar uma olhada na herança de subclasses:

local child1 = Parent:new()

child1:print("哈哈哈哈")

-----------------------------输出结果
父类输出:哈哈哈哈

function child1:print(str)
	print("子类1输出:"..str)
end

child1:print("哼哼哼哼")

-----------------------------输出结果
子类1输出:哼哼哼哼

No código acima, child1 é uma nova tabela obtida através do método Parent new. A metatabela desta tabela é o Parent. O método de impressão do pai será chamado sem reescrever. Se for reescrito, também é muito simples. Use o mesmo nome do método. Basta escrevê-lo uma vez e chamar após a reescrita para executar o método reescrito.

 

(2) Herança múltipla

A implementação da herança múltipla é realmente muito simples. Implementamos a herança por meio do exemplo acima. Descobrimos que encontrar a classe pai é, na verdade, procurar o meta método __index da meta tabela. Nossa única herança acima é definir __index como uma tabela. A herança múltipla é definir __index como um método, que pesquisará o método ou atributo de que precisamos em várias tabelas e, em seguida, retornará o atributo ou método encontrado.

--search方法用来从多个父类表中查找
local function search(key,list)
	for _,pValue in ipairs(list) do
		local v = pValue[key]
		if v then
			return v
		end
	end
end 

--createClass用来创建子类
function createClass(...)
	local proxy = {}
	local parents = {...}
	local meta = {
		__index = function(self,key)
			return search(key,parents)
		end
	}
	setmetatable(proxy,meta)
	return proxy
end


----------------------------------演示例子
local Parent1  = {}
local Parent2  = {}

function Parent1:print1()
	print("父类1输出")
end

function Parent2:print2()
	print("父类2输出")
end
local child1 = createClass(Parent1,Parent2)

child1:print1()
child1:print2()

----------------------------------输出
父类1输出
父类2输出

No código acima, usamos o método de pesquisa para filtrar as chaves em várias tabelas. No método createClass, definimos o meta método __index da meta tabela do proxy da tabela para pesquisar. Os parâmetros são a chave a ser pesquisada e vários herdado. Tabela, para que possamos perceber a ideia de herança múltipla, você pode consultar o exemplo de demonstração acima.


3. Empurre

Github : https: //github.com/KingSun5

Meta tabela: https://blog.csdn.net/Mr_Sun88/article/details/105205942


4. Conclusão

O blogueiro apresentou brevemente as ideias de realização. Mais funções precisam ser continuamente aprimoradas. Se você acha que o artigo do blogueiro está bem escrito, você pode querer prestar atenção nele e gostar da postagem do blog. Além disso, a capacidade do blogueiro é limitado. Se houver algum erro no artigo, você pode comentar e criticar.

       Grupo de troca QQ: 806091680 (Chinar)

       Este grupo foi criado pelo blogueiro da CSDN Chinar, recomendo! Eu também estou no grupo!

Acho que você gosta

Origin blog.csdn.net/Mr_Sun88/article/details/105720830
Recomendado
Clasificación