Visitante!
Faça seu Login ou Registre-se!

Galeria de Jogos

[Ruby] class << Aula8 #Superclasse, heranças e instâncias 8 Respostas | 1201 Visualizações

0 Membros e 1 Visitante estão vendo este tópico.

Raizen

  • *
  • Mensagens: 2479 Ouro: 1857

    Vencedor CRM Awards - Melhor Scripter Vencedores das edições do Concurso Projeto Rickas!

    • Ver perfil
    • E-mail
Índice das aulas básicas
Índice das aulas avançadas
Índice das aulas de algoritmos
Superclasse, heranças e Instâncias
Conhecimento necessário : médio

Jovem gafanhoto, se está nessa aula é porque realmente está interessado no Ruby e tudo é possível de ser feito nele. Antes de tudo, e de qualquer aula devo dizer o seguinte, tudo, espera, TUDO no Ruby é objeto, até o valor nulo é objeto, tendo isso em mente é possível criar métodos, instanciar e criar "herdeiros" dos objetos em questão. Nessa aula iremos nos aprofundar em algo que vimos na aula 2, porém com todo o conhecimento que obtiveram até agora.


A primeira classe que tem no Ruby é a Class, sim bem estranho ser dito desse modo, mas para a revelação a todos, Class é uma classe. Toda nova classe utiliza os métodos padrões de Class, como new por exemplo que poucos devem sequer ter reparado. Aquele Window_Base.new, esse método new vem da classe Class. Parentescos e herança, no Ruby como tudo é objeto, eles estão também interligados entre si. Agora uma revelação, a classe de que conhecem na realidade é uma subclasse do módulo.
Em resumo essa imagem.

Spoiler
[close]
Créditos a Andrea Singh por essa imagem bunitinha :).

Como podem ver tudo é interligado como uma árvore de heranças, e cada objeto tem suas heranças ou parentescos, essa é a "lei" dos objetos no Ruby, tendo em mente que tudo é objeto, é mais fácil manipular cada um dos objetos como preferem, e sabendo disso, podemos partir para a prática finalmente em relação a todas essas ligações entre os objetos no Ruby.

Superclasse

Superclasse é o nome dado a classe do qual originou o objeto, em sua maioria a classe, basicamente no Ruby é feito desse modo.
Código: [Selecionar]
class Raizen_son < RaizenNo código acima eu declaro uma nova classe Raizen, que ao ser criada é designada uma constante global(inicia com letra maiuscula), e ela tem como superclasse o Raizen, ela terá todos os métodos, atributos e objetos ligados ao Raizen por padrão.
Teste o exemplo abaixo para ver como funciona.

Código: [Selecionar]
class Raizen
  def metodo
    p "um metodo"
  end
end

class Raizen_son < Raizen
end

a = Raizen_son.new
a.metodo

Verá que foi impresso o "um metodo" na tela, isso é porque o Raizen_son tem todos os métodos da classe Raizen, porém se eu reescrever um método.

Código: [Selecionar]
class Raizen
  def metodo
    p "um metodo"
  end
end

class Raizen_son < Raizen
  def metodo
    p "outro metodo"
  end
end

a = Raizen_son.new
a.metodo

Perceberá que foi impresso "outro metodo", isso porque a prioridade por lógica, é da classe atual, logo o método a ser chamado não será mais da superclasse, porém para que ainda possa se utilizar métodos da classe anterior, existe a função super, super substitui o método no qual ele foi inserido, considerando argumentos e blocos que estão nos paramêtros no método de origem, e isso pode ser feito inumeras vezes como em uma cadeia, bom o ideal é ver na prática como funciona.

Código: [Selecionar]
class Raizen
  def metodo
    p "um metodo"
  end
end

class Raizen_son < Raizen
  def metodo
    super
    p "outro metodo"
  end
end

class Raizen_son2 < Raizen_son
  def metodo
    super
    p "mais outro metodo"
  end
end
a = Raizen_son2.new
a.metodo

Se perceber ele irá imprimir de todos os métodos, isso porque a função super, chama o método de mesmo nome das classes mães.


Instâncias e atributos

Primeiro o que seriam atributos, atributos são caracteristicas de um objeto, isso como definição geral em qualquer linguagem.
Basicamente eu tenho um objeto Bola, e posso ligar os atributos cor e tamanho a ele, assim sempre que eu quiser posso buscar esses atributos no objeto Bola. Para criar um atributo é necessário uma variável especial, a variável de instância(Aula 3), essa variável é precedida por arroba(@). Existe uma boa razão para a variável ter esse nome, a variável de instãncia é acessado apenas internamente do objeto, porém ele pode ser definido como um atributo, e desse modo ele pode ser acessado externamente. Para definir uma variável de instância como atributo basta, declara-lo como um atributo desse modo. attr_reader para leitura, attr_accessor para acesso.

Código: [Selecionar]
class Raizen
attr_reader :var1
attr_accessor :var2

def initialize
  @var1 = 2
  @var2 = 4
  end
end
objeto = Raizen.new
p objeto.var1
p objeto.var2

Lembrando que o reader serve justamente para apenas retornar o valor, e o accessor para que acesse a variável e consequentemente a manipule, logo o seguinte código da erro com o reader e não dá com o accessor.

Retorna erro
Código: [Selecionar]
class Raizen
attr_reader :var1

def initialize
  @var1 = 2
  end
end
objeto = Raizen.new
objeto.var1 += 2
p objeto.var1

Não retorna erro
Código: [Selecionar]
class Raizen
attr_accessor :var1

def initialize
  @var1 = 2
  end
end
objeto = Raizen.new
objeto.var1 += 2
p objeto.var1


Instância, bom o que vimos acima foi basicamente criar essa instância para a variável, e o que exatamente seria instância? instância a grosso modo seria a criação a partir de um molde, de uma base, de um original. Basicamente, quando eu utilizo o método new, em uma classe qualquer eu estou criando uma instância daquela classe a partir de um objeto. Exemplo para entenderem melhor,

Código: [Selecionar]
$scene = Scene_Base.new
No código acima o $scene é uma instância da classe Scene_Base, ele não é a classe Scene_Base e sim um exemplo, uma parte, eu não diria uma cópia, pois a partir de classes iguais é possível ter objetos diferentes. Com base nisso podemos definir 2 métodos diferentes, os métodos de classe e os métodos de instância.

Sim jovem, você pode nem conhecer a diferença dos 2, mas se já criou scripts em Ruby, provavelmente já utilizou ambos sem perceber. Os métodos de instância são aqueles acessíveis pela instância da classe, os de classe são os acessíveis diretamente pela classe.

Teste o seguinte.
Código: [Selecionar]
class Raizen
def self.metodo
  'metodo de classe'
end
end
p Raizen.metodo
obj = Raizen.new
p obj.metodo

Verá que o segundo deu errado, porque? Pois o metodo está ligado diretamente a classe Raizen e não as instâncias que no caso quando instanciei o Raizen no objeto obj. Agora pode ser testado o seguinte também.
Código: [Selecionar]
class Raizen
def metodo
  'metodo de instância'
end
end
obj = Raizen.new
p obj.metodo
p Raizen.metodo
Verá que o que deu errado foi tentar usar o método de instância como um método de classe, ele não encontra.

Sabendo tudo isso, vamos a algo interessante :).

Eigenclass

Eigenclass ou Singleton Class, não é algo trivial, por isso tentarei explicar de um modo simples e direto.
Eigenclass basicamente é uma subclasse porém dentro da própria classe, é o que aconteceu quando adicionamos o self antes do método, aquele método se torna "parte" do objeto self e ao instanciar ele não faz parte da instância, mas o uso não é apenas isso, podemos inserir métodos e objetos diretamente na classe desejada e assim criando "sub-classes" a partir de sua origem. Como se métodos da eigenclass por exemplo, fosse eu adicionar esses métodos em um determinado objeto e que apenas nele irá ter efeito, veja o seguinte abaixo.

Código: [Selecionar]
class Raizen
  def metodo
  p 'um metodo'
  end
end

obj = Raizen.new
obj.metodo
class << obj
    def metodo2
        p 'outro metodo'
    end
end
obj.metodo2
Eu instanciei o método diretamente no objeto obj, isso é uma eingenclass, assim não é necessário eu criar um método diretamente na superclasse do objeto para que eu possa utiliza-lo, posso adicionar diretamente no objeto, como se eu adicionasse um novo caminho em tudo aquilo dito nessa aula em relação a heranças e parentescos, a superclasse de uma eingenclass é o próprio objeto de origem.

Também pode ser usado das seguintes maneiras.

Código: [Selecionar]
class Raizen
  def metodo
    p 'um metodo'
    end
    class << self
        def metodo2
            p 'outro metodo'
        end
    end
end
Raizen.metodo2

ou direto no objeto que instanciou a classe

Código: [Selecionar]
class Raizen
  def metodo
    p 'um metodo'
    end
end
obj = Raizen.new
class << obj
    def metodo2
        p 'outro metodo'
    end
end
obj.metodo
obj.metodo2
Como podem ver para adicionarmos métodos com esse modo é muito mais simples e rápido, além de mais lógico para o programa.
Finalizando

Ufa,  :'-': , acho que terminamos essa aula, espero que tenham aprendido, e para quem já conhece sobre tal, se há algo a ser corrigido, retirado ou adicionado me avise, e na próxima aula veremos algum ponto importante que poderei adicionar.
« Última modificação: 16 Dez 2015, 10:32 por Raizen »

Masked

  • *
  • Mensagens: 606 Ouro: 619

    Vencedor CRM Awards - Melhor Scripter

    • RPG Maker VX/Ace
    • Ver perfil
  • Anel de RubiSpiked MailColossusHeimhelmNightwalker
Re: class << Aula8 #Superclasse, heranças e instâncias
Resposta 1 Online: 05 Fev 2014, 19:36
Muito boa a aula Raizen, não sei se não falou do attr_writer porque ele é muito pouco usado ou se foi um erro mesmo, mas...

E eu vivia tendo problemas com métodos de classe e de instância, às vezes eu tinha que adicionar o self mas não sabia porque...

Ah,me tem como eu criar mais um objeto com a eigenclass do obj? Tipo... obj.new?

SimonMuran

  • *
  • Mensagens: 1395 Ouro: 480

    Medalha dada aos vencedores da 1ª Amostra de Arte de Steamfórdia Participantes do Halloween na Tela Participantes do Maps Together 2 Ganhou 1 vez na categoria Mapeamento - O Que Fazer

  • Saudações, como vai você?
    • RPG Maker VX/Ace
    • Ver perfil
    • E-mail
  • GáleaColossusNightWalkerSpiked Mail
Re: class << Aula8 #Superclasse, heranças e instâncias
Resposta 2 Online: 05 Fev 2014, 19:44
Ctrl + D Efetuado com sucesso.


Um bom conjunto de aulas boas não aparecem assim do nada, então já é bom guardá-las rsrsrs

Ótima aula tio Raizen, está na lista de coisas que irei aprender depois de pixel art, mas pela leitura que

fiz, vi que vou apanhar igual mulher de malandro pra essas aulas, quantos códigos ;-; kkkk

Enfim, parabéns *o* e por favor poste mais aulas, é de excelente ajuda.
But beware!
For when you quench your blood thirst
Others will seek their vengeance on you
And they won't rest until you're dead.

Raizen

  • *
  • Mensagens: 2479 Ouro: 1857

    Vencedor CRM Awards - Melhor Scripter Vencedores das edições do Concurso Projeto Rickas!

    • Ver perfil
    • E-mail
Re:  class << Aula8 #Superclasse, heranças e instâncias
Resposta 3 Online: 05 Fev 2014, 22:15
Muito boa a aula Raizen, não sei se não falou do attr_writer porque ele é muito pouco usado ou se foi um erro mesmo, mas...

E eu vivia tendo problemas com métodos de classe e de instância, às vezes eu tinha que adicionar o self mas não sabia porque...

Ah,me tem como eu criar mais um objeto com a eigenclass do obj? Tipo... obj.new?
Ah pods crê, nem nem eu esqueci mesmo shUAsh, a parte dos atributos fiz o que eu lembrei e como uso muito pouco esqueci dissâe vou adicionar vlws :).

Sobre a pergunta, pelo que eu entendi, não xD, porque a ideia de eigenclass por alguma razão no Ruby chamam assim, mas acho que o mais usual na internet é o Singleton class, ele é feito para se ligar a um objeto já criado e não criar um, logo acredito eu que não :P.

Ctrl + D Efetuado com sucesso.


Um bom conjunto de aulas boas não aparecem assim do nada, então já é bom guardá-las rsrsrs

Ótima aula tio Raizen, está na lista de coisas que irei aprender depois de pixel art, mas pela leitura que

fiz, vi que vou apanhar igual mulher de malandro pra essas aulas, quantos códigos ;-; kkkk

Enfim, parabéns *o* e por favor poste mais aulas, é de excelente ajuda.

ah cara eu sugiro as aulas do índice para começar xD, essa é bem mais complicada que as outras lá, as outras acho que você terá bem mais facilidade para entender e depois de aprender tudo vir para essa daqui :D.
Vlws :D

Kvothe
  • *
  • Mensagens: 641 Ouro: 1295
  • Maker Geral
    • Unity
    • Facebook
    • DeviantArt
    • Ver perfil
    • E-mail
Re: class << Aula8 #Superclasse, heranças e instâncias
Resposta 4 Online: 06 Fev 2014, 12:23
 Hou, como já havia dito no face, ficou muito boa a sua aula bem explicada e tal.. É o correto mesmo e Singleton. Espero ver mais, só que mais avançada..kk..


"Amamos aquilo que amamos. A razão não entra nisso. Sob muitos aspectos, o amor insensato é o mais verdadeiro. Qualquer um pode amar uma coisa por causa de. É tão fácil quanto por um vintém no bolso. Mas amar algo apesar de, conhecer suas falhas e amá-las também, isto é raro, puro e perfeito". (O Temor do Sábio, pág. 58)

Pretty-Belle

  • *
  • Mensagens: 170 Ouro: 634

    Melhor pontuação no Evento X'mas Factory

  • "Can't find a door, make your own!"
    • DeviantArt
    • Ver perfil
  • Elmo de Natal
Re: class << Aula8 #Superclasse, heranças e instâncias
Resposta 5 Online: 08 Fev 2014, 08:29
Não vai ter nenhum dever de casa? ;-;
Eu penei um pouquinho para entender a diferença de método de classe e de instância, mas no fim acho que entendi xD Fiquei só com uma dúvida... Existe alguma vantagem usar um ou o outro? Em que momento é melhor usar cada um deles?

Enfim, ótima aula, Raizen! ^u^ Estou aproveitando que agora não tenho mais matérias bestas do Ensino Médio para me focar em programação :3 Vão ser quantas aulas ao todo?
Já perceberam que em vez de as pessoas usarem esse espaço para uma assinatura de fato, elas colocam alguma coisa aleatória (imagem, frase filosófica, divulgação), e colocam no corpo das mensagens o que deveria ser a assinatura?

Raizen

  • *
  • Mensagens: 2479 Ouro: 1857

    Vencedor CRM Awards - Melhor Scripter Vencedores das edições do Concurso Projeto Rickas!

    • Ver perfil
    • E-mail
Re:  class << Aula8 #Superclasse, heranças e instâncias
Resposta 6 Online: 08 Fev 2014, 11:31
Não vai ter nenhum dever de casa? ;-;
Eu penei um pouquinho para entender a diferença de método de classe e de instância, mas no fim acho que entendi xD Fiquei só com uma dúvida... Existe alguma vantagem usar um ou o outro? Em que momento é melhor usar cada um deles?

Enfim, ótima aula, Raizen! ^u^ Estou aproveitando que agora não tenho mais matérias bestas do Ensino Médio para me focar em programação :3 Vão ser quantas aulas ao todo?
Essa aula é bem mais complicada que as 7 anteriores, dá uma olhadinha no índice depois, não sei se viu as aulas anteriores x3, por isso acabou não tendo lição de casa, nas anteriores tem.

Ai depende de como você quer usar a classe, por examplo, eu instanciei a classe desse modo.
$game_player = Game_Player.new

Eu normalmente faço isso para que eu eu possa modificar o $game_player, ou buscar atributos dele, além de outras funções, fiz isso uma vez, logo o ideal é eu ter métodos de instancia para usar com o $game_player, se eu crio um módulo e uso ele apenas para buscar informação e não manipular ele, ai eu crio métodos de classe para ele :)


Sobre o número de aulas, eu tenho que ver oque preciso colocar a mais, então é meio que indefinido, mas essas próximas são tudo de nível intermediário para cima, logo vão ser mais complicadas xD.
« Última modificação: 08 Fev 2014, 11:32 por Raizen »

Pretty-Belle

  • *
  • Mensagens: 170 Ouro: 634

    Melhor pontuação no Evento X'mas Factory

  • "Can't find a door, make your own!"
    • DeviantArt
    • Ver perfil
  • Elmo de Natal
Re: class << Aula8 #Superclasse, heranças e instâncias
Resposta 7 Online: 08 Fev 2014, 12:33
Sim, eu tinha vista as aulas anteriores c: Inclusive fiz todos os exercícios avançados (na vdd só fiz eles, eu sempre pulo os fáceis xD). Eu só não comento porque prefiro checar os erros eu mesma. Eu só tive dificuldade para entender essa parte mesmo, mas meu irmão acabou me ajudando (ele não é scripter, mas fez um curso técnico sobre linguagens orientadas a objetos, então ele me deu uma explicação geral x3).
Obrigada, eu entendo agora ^^

E sobre os assuntos das próximas aulas poderiam ter algo com relação à interação entre jogador e código. Tipo seleção de comandos e tals. O único comando de leitura que sei é o "gets", isso porque eu pesquisei na internet para fazer aquela atividade lá dos números primos (não lembro que aula era)...
Já perceberam que em vez de as pessoas usarem esse espaço para uma assinatura de fato, elas colocam alguma coisa aleatória (imagem, frase filosófica, divulgação), e colocam no corpo das mensagens o que deveria ser a assinatura?

Ryugo

  • *
  • Mensagens: 66 Ouro: 8
  • Olá!
    • RPG Maker VX/Ace
    • Ver perfil
Re: class << Aula8 #Superclasse, heranças e instâncias
Resposta 8 Online: 09 Fev 2014, 22:34
Oloco! '-'

Achei que suas aulas tinham acabado,e entro aqui e vejo essa  :*-*:
Infelizmente só vi agora a noite,e provavelmente só poderei estudar ela sábado (escola integral)  :=|:

E sobre os conteúdos das próximas aulas que eu espero que tenha  :XD: eu concordo com a Pretty,seria legal ensinar comandos de interação direta com o jogador  :ok:

 

Versão Mobile