Vou dizer, a quantidade de GIFs e memes desse post me deixou tonto, mas fora isso tem alguns erros conceituais, eu não vou me alongar muito com fontes porque toda vez que se fala de POO com fontes alguém negativa:
A forma base de se pensar em POO é abstrair, e criar classes para servirem de modelo para a criação dos objetos que serão usados nos programas – perceba que POO tenta se voltar mais para a realidade, pois tenta pegar objetos do mundo real e transformá-los em código.
Mais ou menos, a forma base real é: abstrair, modelar, encapsular e extender, em outras fontes você acha termos diferentes mas com o mesmo efeito, ou seja que tipo os objetos vão ter, ao contrário da CRENÇA popular, POO não tem classes (sim, você e 90% aprenderam errado)
Classe, Estrutura, Protótipo
São diferentes formas de dizer como determinado objeto deve ser:
- Protótipos são objetos que você pode usar diretamente e também pode fazer com que outros objetos busquem referências nele
- Classe e Estrutura, são referencias para onde objetos buscam coisas faltando neles (vai ficar mais claro em extensão)
A diferença entre Classe e Estrutura é que em Estruturas o encapsulamento é feito dentro da declaração, e em estruturas, fora dela. Em resumo Classe e Estrutura ditam como um objeto deve se parecer funcionando como uma planta de construção, enquanto Protótipos são um modelo em si
Objeto
Um Objeto é uma entidade que agrupa propriedades e ações, pode ou não ser uma instancia de uma classe
Extensão (não da mais pra prosseguir sem)
Numa herança você tem uma linha de sucessão de referência, considerando o objeto "allSpark" que é do tipo Cubo, que por sua vez é do tipo Hexaedro (caso não saiba, nem todo hexaedro é um cubo), funciona assim:
allSpark->lados();
O que acontece aqui, allSpark
é uma extensão de cubo (sim, instanciar uma classe é extender ela, já vou para Lua onde isso é mais explícito) então ele vai "perguntar": allSpark tem o método lados()? Se sim, chame ele e passe ele mesmo como primeiro argumento (geralmente implícito), não tem? Cubo tem? Se sim, chame ele, passando allSpark
como primeiro argumento, ainda não tem? Hexaedro tem? Se sim, chame ele, passando allSpark
como primeiro argumento, se não dê um erro, em Lua para visualizar melhor:
-- Declaramos a "Classe" Hexaedro e o método lados()
Hexaedro = {}
function Hexaedro:lados()
print("Chamando de Hexaedro",self) -- O nome muda mas é o mesmo this de Java
return 6
end
-- Declaramos a "Classe" Hexaedro e o método forma()
Cubo = {}
function Cubo:forma()
print("Chamando de Cubo",self) -- O nome muda mas é o mesmo this de Java
return "Quadrado"
end
-- Instanciamos o allSpark
local allSpark = setmetatable({},{__index=Cubo}
print(allSpark) -- Pra gente ver o ID na memória
allSpark:lados()
allSpark:forma()
-- Vamos pegar os métodos
print(rawget(allSpark,"lados")) -- nil, (Não existe em allSpark)
print(rawget(allSpark,"forma")) -- nil, (Não existe em allSpark)
Tudo isso pra mostrar que isso aqui não acontece "Na verdade o que será copiado são os métodos e atributos e colar em outra classe.", o que acontece é uma "cadeia de pesquisa" ou "Lookup chain" mesmo em Java, isso inclusive leva a ideia de que POO é lento, mas a verdade é que POO só fica lento com a "inheritance hell", mas aí já é assunto pra outro tópico