O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

[Ruby] class << Aula8 #Superclasse, heranças e instâncias

Iniciado por Raizen, 05/02/2014 às 17:56

05/02/2014 às 17:56 Última edição: 11/09/2019 às 16:01 por Raizen
[box class=windowbg1]
Índice das aulas básicas
  • Aula 1 - Introdução
  • Aula 2 - Objetos
  • Aula 3 - Operações
  • Aula 4 - Condições
  • Aula 5 - Repetição
  • Aula 6 - Arrays
  • Aula 7 - Hashes
    [/box]
    [box class=windowbg1]
    Índice das aulas avançadas
  • Aula 8 - Superclasses e instâncias
    [/box]
    [box class=windowbg1]
    Índice das aulas de algoritmos
  • Aula 1 - Sort
  • Aula 2 - Busca
  • Aula 3 - Recursividade
    [/box]

    [box class=windowbg]
    Superclasse, heranças e Instâncias
    [/box]
    Conhecimento necessário : médio

    [box class=windowbg2] 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.[/box]

    [box class=windowbg]
    Superclasse
    [/box]

    [box class=windowbg2]Superclasse é o nome dado a classe do qual originou o objeto, em sua maioria a classe, basicamente no Ruby é feito desse modo.
    class Raizen_son < Raizen
    

    No 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.

    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.

    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.

    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.[/box]


    [box class=windowbg]
    Instâncias e atributos
    [/box]

    [box class=windowbg2]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.

    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
    class Raizen
    attr_reader :var1
    
    def initialize
      @var1 = 2
      end
    end
    objeto = Raizen.new
    objeto.var1 += 2
    p objeto.var1
    


    Não retorna erro
    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,

    $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.
    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.
    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 :).[/box]

    [box class=windowbg]
    Eigenclass
    [/box]

    [box class=windowbg2]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.

    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.

    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

    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.
    [/box]
    [box class=windowbg]
    Finalizando
    [/box]

    [box class=windowbg2]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.
    [/box]

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?
~ Masked

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.

Citação de: Masked online 05/02/2014 às 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?
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.

Citação de: SimonMuran online 05/02/2014 às 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.

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

 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..



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, tipo o que estou fazendo agora), e colocam no corpo das mensagens o que deveria ser a assinatura?

08/02/2014 às 11:31 #6 Última edição: 08/02/2014 às 11:32 por Raizen
Citação de: Pretty-Belle online 08/02/2014 às 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?
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.

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, tipo o que estou fazendo agora), e colocam no corpo das mensagens o que deveria ser a assinatura?

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: