Classes

A definição de uma classe se inicia com o uso da palavra class, e termina com a palavra end, da seguinte maneira:

class Classe
end

Herança é expressa pelo símbolo de menor-que ('<') ao lado do nome da classe, seguido da super-classe. Por exemplo:

class Humano < Mamifero
end

Na definição de uma classe pode-se ter quaisquer expressões válidas, ou seja, comandos, novas definições de classes, métodos, módulos, etc..

class Teste
  class Teste
    puts "A classe Teste::Teste está sendo definida."
    def oi
      puts "oi"
    end
  end
end

O operador de escopo, ::, é usado para acessar membros internos de uma classe, ou para acessar explicitamente uma constante externa a quaisquer classes/módulos, prefixando a constante.

a = Teste::Teste.new
a::oi                  # >> oi
a.oi                   # >> oi
puts FALSE == ::FALSE  # >> true

A inicialização das instâncias de uma classe é feita pelo método initialize (note o 'z'). Os métodos de nomes iniciados por attr (attr, attr_accessor, attr_reader, e attr_writer da classe Module) servem para declarar atributos e seus getters/setters automaticamente.

class Pessoa
  attr "nome"
  attr "idade"

  def initialize(nome, idade)
    @nome, @idade = nome, idade
  end
end

p = Pessoa.new("Jeca", 33)
p.nome     # >> Jeca
p.idade    # >> 33

Definições de classes nunca estão fechadas. Ou seja, é possível fazer sua definição ao longo de várias partes do programa, da seguinte maneira:

class Teste
  def oi
    puts "oi"
  end
end

class Teste          # Continua a definição da classe
  def tchau          # Novo método
    puts "tchau"
  end
end

a = Teste.new
a.oi           # >> oi
a.tchau        # >> tchau

Porém, é possível chamar o método freeze de uma classe, e assim impedir sua alteração posterior.

class A
end
A.freeze

class A
  def aie
  end
end        # >> TypeError: can't modify frozen class ...

Também é possível definir classes singleton, que são classes específicas a um objeto, usando class << objeto .... A forma para fazer isso é:

objeto = "abc"
class << objeto
  def aie
    "aie"
  end
end

puts objeto.aie  # >> aie

Outra forma, implícita, de criar uma classe singleton é definindo um método singleton, como é visto na seção "Métodos". Ambas as formas são equivalentes, porém pode ser mais conveniente usar uma ou outra, dependendo das circunstâncias.

É possível limitar a visibilidade de métodos e constantes, usando os métodos public (acesso público), protected (acesso apenas a objetos da classe e subclasses) e private (só podem ser chamados sem receptor explícito). Chamados sem argumentos, alteram a visibilidade padrão. Chamados com argumentos, alteram a visibilidade dos métodos e constantes especificados. Porém, devido a natureza dinâmica de Ruby, isto apenas dá uma certa formalidade à interface das classes.

topo da página

<< Página Anterior | índice | Próxima Página >>
Apostilas de Ruby e RGSS

nossos tutoriais

navegue

livros recomendados