×

Langue

Fermer
Atelier 801
  • Forums
  • Dev Tracker
  • Connexion
    • English Français
      Português do Brasil Español
      Türkçe Polski
      Magyar Română
      العربية Skandinavisk
      Nederlands Deutsch
      Bahasa Indonesia Русский
      中文 Filipino
      Lietuvių kalba 日本語
      Suomi עברית
      Italiano Česky
      Hrvatski Slovensky
      Български Latviešu
      Estonian
  • Langue
  • Forums
  • /
  • Transformice
  • /
  • Archives
  • /
  • Seção Editor de Mapas e Modules
  • /
  • [Tutorial] Básicos de uma classe
[Tutorial] Básicos de uma classe
Hydroper
« Citoyen »
1487152500000
    • Hydroper#0528
    • Profil
    • Derniers messages
    • Tribu
#1
  0
Básicos

(Preciso re-elaborar o tópico.)

O que é uma classe?

Um modelo instanciável, programaticamente.

Instância

Um instância é tipo uma ocorrência de uma classe.

Base (das instâncias)

A base de uma classe é acessível por suas instâncias. A base contém membros, métodos, etc.

Base estática

A base estática de uma classe é a própria classe, contendo membros, métodos e etc. em sí mesma.

Características comuns

Classe dinâmica e classe estática.

Hierarquia básica

Uma classe B herda de uma classe A; o modelo da classe B basea no modelo da classe A, a classe A seria parente dessa.

Construtor

Encarregado de instanciar uma classe.

Métodos

Métodos são membros da base, que são funções. A maioria das implementações básicas para trabalhar com classes em Lua (utilizando tabelas e metatables) geralmente (depende da funcionalidade) requerem que a instância seja passada como primeiro argumento do método. Se forem métodos estáticos vai depender de como são criados.

Minha implementação de classes


O mais comum para criar e trabalhar com classes no Lua é o uso de tabelas e metatables.
Sempre uso esse estilo de implementação na(s) minha(s) biblioteca(s), para criar classes com estruturas similiares.


  • class_createclass(): cria uma classe sem base e sem construtor.
  • class_createinstance(classe): cria instância de uma classe.
  • class_constructsuper(classe): constrói a classe parente a qual uma classe herda, e atualiza a metatable do retorno para a base da classe atual.
  • class_owns(v, classe): verifica se um valor é instância de uma classe (até a última classe parente).
  • class_setconstructor(classe, f): define a função construtora da classe, i.e.: Classe().
  • class_setprotobase(classe, b): define a base de membros, métodos, etc. de uma classe.
  • class_setsuperclass(classe, s): define uma nova classe parente de uma classe e herda dela.


Exemplo de uso
Code Lua

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
local Scanner = class_createclass()

class_setprotobase(Scanner, {
-- Obs.: isso não é lexer de verdade a-a
lex = function(self)
print('Executando lexer ('..self.valor..')')
end
})

class_setconstructor(Scanner, function(Scanner, valor)
local s = class_createinstance(Scanner)
s.valor = valor
return s
end)

-- ## Testando

Scanner(40):lex()

Código
Code Lua

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
local env_getmetatable, env_setmetatable =
getmetatable, setmetatable;

-- # Class

-- ## Class functions and helpers

-- Creates an empty class and return itself as a table.

local function class_createclass() return env_setmetatable({ proto = {} }, {}) end

-- Creates an instance of a class.

local function class_createinstance(C) return env_setmetatable({}, C.proto) end

-- Constructs the super class of a class.

local function class_constructsuper(C) return env_setmetatable(env_getmetatable(C).__index(),
C.proto) end

-- Checks if a value is instance of a class.

local function class_owns(value, C)
local m = env_getmetatable(value);
if (not m) then return false end;

local proto = C.proto;

while (proto) do
if (m == proto) then return true end;

-- Continue checking the prototype of parent classes
-- until they end.

proto = env_getmetatable(proto);
proto = proto and proto.__index;
end

return false;
end

-- Sets the constructor of a class.

local function class_setconstructor(C, f) env_getmetatable(C).__call = f end

-- Sets the prototype base of a class.

local function class_setprotobase(C, b)
C.proto.__index = b;

-- Merge super prototype base.

local Super = env_getmetatable(C);
if (Super) then env_setmetatable(b, Super.proto) end;
end

-- Sets the super (base) class of a class.

local function class_setsuperclass(CA, CB)
env_setmetatable(CA.proto.__index, CB.proto);
env_getmetatable(CA).__index = CB;
end

Dernière modification le 1488383160000
Lcemt
« Citoyen »
1488375540000
    • Lcemt#0000
    • Profil
    • Derniers messages
    • Tribu
#2
  0
pra que serve "b.__index=c"?

Dernière modification le 1488375600000
Hydroper
« Citoyen »
1488381480000
    • Hydroper#0528
    • Profil
    • Derniers messages
    • Tribu
#3
  0
Se vc se refere à linha
Code Lua

1
C.proto.__index = b;
, isso define a tabela base da classe (que vai ser acessada por instâncias).

Depois dessa linha há um passo extra que serve para herdar a base parente.

Não posso elaborar no tópico agora... Estava pensando em refazê-lo e mudar um pouco do estilo do código
Lcemt
« Citoyen »
1488382800000
    • Lcemt#0000
    • Profil
    • Derniers messages
    • Tribu
#4
  0
Não,só quero saber qual a utilidade de colocar "b.__index=a"
Hydroper
« Citoyen »
1488382920000
    • Hydroper#0528
    • Profil
    • Derniers messages
    • Tribu
#5
  0
Lcemt a dit :
Não,só quero saber qual a utilidade de colocar "b.__index=a"

Eu já falei a utilidade?

", isso define a tabela base da classe (que vai ser acessada por instâncias)."
Grastfetry
« Consul »
1488488760000
    • Grastfetry#0095
    • Profil
    • Derniers messages
    • Tribu
#6
  0
Trancado a pedido do criador.
  • Forums
  • /
  • Transformice
  • /
  • Archives
  • /
  • Seção Editor de Mapas e Modules
  • /
  • [Tutorial] Básicos de uma classe
© Atelier801 2018

Equipe Conditions Générales d'Utilisation Politique de Confidentialité Contact

Version 1.27