[MÚSICA] [MÚSICA] Olá a todos, então estamos na terceira parte do nosso exemplo aqui de herança, certo, agora vamos fazer a classe corrida que vai colocar os carros, não é, e vamos ver quem vai ganhar aí essa corrida, está certo? Então assim recapitulando o que a gente já fez, a gente criou uma classe abstrata chamada carro de corrida que o método acelerar é método abstrato. Criamos o carro soma que soma a potência certo, como algoritmo de aceleração e criamos o carro multi que ele tem a potência entre 1 e 2, certo, e ele multiplica a velocidade por essa potência, sendo que na primeira acelerada ele vai sempre colocar 10 na velocidade, está certo? Os 2 aqui têm uma velocidade máxima que eles não conseguem passar. Fizemos aqui também os testes de unidade e verificamos aqui que os 2 estão funcionando como esperado, está certo? Então eu vou fechar todos essas abas aqui, está, e vou começar a criar então a minha classe corrida, certo? A minha classe corrida ela vai se basear só na classe abstrata, ou seja para ela não interessa qual que é o algoritmo de acelerar, ela simplesmente vai mandar os carros acelerarem não é, a cada ciclo ali da corrida, está? Então a corrida o que ela tem que ter de mais importante assim é o tamanho dela, está, é o comprimento, vou chamar aqui, comprimento da pista, vamos chamar de pista, pronto, estou indeciso aqui no nome mas vai ser pista. está? Então eu vou passar aqui o tamanho da corrida, não é, e ele vai colocar ali na pista, está? Então ele vai ser aqui pista é igual ao tamanho. Então é aquele ali a distância que os carros vão precisar percorrer, está certo? Eu também vou criar aqui mapa está? O mapa ele é uma estrutura de dados Java que ele tem uma chave e ele tem valor. Então o que é que eu vou fazer? Na minha corrida o carro vai ser a chave, certo, e a distância que aquele carro já percorreu vai ser o valor, está? E então eu vou vir aqui, vou criar mapa que ele vai ter carro de corrida e inteiro que vai ser, integer aqui, que vai ser a distância que ele percorreu. Aí eu vou chamar esse mapa de carros e já vou inicializar com HashMap, certo? Então vamos importar aqui não é, eu posso importar, vocês não estão vendo aí mas usando o Ctrl Shift O está, então eu vou passar a fazer isso nos próximos exemplos para poupar aqui pouco do tempo, está certo? Então agora que eu criei o carro, eu vou criar aqui método que é o adicionaCarro na corrida, certo? Ele vai receber carro de corrida, pode ser, como ele recebe carro de corrida pode ser de qualquer uma das duas subclasses, certo, faltou dizer aqui que esse método é void, e vou vir aqui e vou colocar carros.put aí eu vou colocar aqui o carro e vou colocar 0, não é, ou seja ele está saindo da largada, ok? Adicionei os carros, certo, e eu vou criar aqui para mim também método privado certo, que vai me falar se a corrida terminou ou não. Como que eu vou fazer isso? Eu vou verificar se algum carro possui o, a distância percorrida maior do que a pista, não é? Se tiver quer dizer que terminou. Então eu vou fazer forzinho aqui, não é, de CarroDeCorrida, ou melhor eu já vou fazer aqui dos valores já. Integer valor, certo, que aqui para princípio não interessa quem que foi que passou, não é, então o valor eu tenho aqui carros ponto eu posso botar values, que vão ser os valores ali, no caso ele vai pegar os inteiros e eu vou fazer o seguinte: se o valor for maior que a pista, então retorna verdadeiro. Se eu verifiquei todos os valores, aí eu retorno falso. Se eu verifiquei todos os valores e nenhum dele é maior, vou ter que colocar aqui maior ou igual não é, ali o igual quando ele acaba ali de passar a pista, certo? Então eu tenho ali a minha corrida, eu adiciono os carros, a próxima coisa que eu tenho que fazer aqui é o, vou chamar aqui esse de método aqui de UmDoisTresEJa não é, ou seja, vamos começar a corrida. Certo? Então o que é que ele vai fazer? Ele vai pegar todos os carros, vai acelerar os carros, então a primeira coisa que ele vai fazer é o seguinte ele vai pegar cada dos carros aqui cadê? Então eu vou fazer for aqui, vou pegar cada carro de corrida, carro, vou lá no meu carros ponto, aí aqui já é a chave que é o key não é então keySet, não é, e aí para cada carro eu vou chamar o acelerar, certo? Seguida eu vou pegar qualquer distância atual, não é, então distanciaAtual certo? Melhor, só distância então eu vou fazer carros.get carro então ele vai pegar a distância daquele carro e ele vai, opa faltou n aqui para ficar bonitinho, eu vou fazer aqui distancia mais igual à velocidade do carro não é, então mais igual velocidade, cadê aqui? Não, não é velocidade, é carro.getVelocidade, aí sim e vou colocar essa distância de novo lá. Então vou fazer assim carros.put o carro e a distância. Então a cada ciclo ele vai fazer isso daqui está? Então ele vai para cada carro, ele acelera, ele pega a distância do carro, soma a velocidade do carro nessa distância e faz. Isso aqui é ciclo da corrida, só que eu tenho que fazer isso aqui enquanto a corrida não tiver terminado. Então eu vou colocar aqui while terminou, ou menor enquanto não terminou então eu tenho que fazer isso daqui enquanto ainda não terminou, então eu vou colocar aqui esse while terminou certo e ele vai ter terminado aqui a corrida. está? Então quando ele terminar a corrida eu vou querer imprimir aqui cada dos carros. Então eu vou colocar aqui sysout o carro ponto o nome dele e vou colocar aqui a distância que ele percorreu, que é o carros.get(carro), que ele vai estar pegando ali o valor certo? Bom, então depois ali da corrida, depois que alguém terminou ele vai imprimir o resultado ali de onde está cada. Eu poderia aqui fazer uma ordenação para ver quem ficou primeiro mas vou fazer assim para simplificar o nosso exemplo, está? Bom agora que eu criei a corrida, vou criar aqui agora uma uma classe principal que vai criar os carros, colocar na corrida, para a gente ver quem vai chegar primeiro. Então, eu vou chamar aqui de "principal". Mandei criar ali o método "main", certo? Tira aqui o construtor que eu sem querer marquei aqui também. Então eu vou criar aqui uma corrida é... "corridaDaAmizade", não é nome de corrida, assim? Monte de corrida da amizade por aí, aposto. "= a new corrida". E vou colocar aqui a distância como 2.000. Certo? Então eu vou começar a adicionar carros nessa corrida. Tá, então vou fazer aqui "corridaDaAmizade. adicionaCarro". Então, o primeiro carro que eu vou colocar, vai ser carro soma. Então esse carro soma vai chamar: "CarroA", certo? É, estou sem criatividade para o nome do carro. Com o que ele vem aqui? Vem a potência, vou colocar 10 e vou colocar a velocidade máxima dele, 110, certo? Vou colocar aqui outro carro soma com a potência menor, a potência dele vai ser 8. Esse aqui vai ser o carro b, só que a velocidade máxima dele vai ser 140. Essa corrida está a ficar interessante. Vamos lá, agora eu vou colocar aqui "CarroMult". Então eu vou colocar aqui "CarroC" que vai ser 1.7 e a velocidade máxima dele é 100. E vou colocar aqui que a potência é 1.4, só que a velocidade dele máxima é 150. Tem que mudar o nome dele aqui, vou chamar de "CarroD". Aí eu vou vir aqui na minha corrida da amizade. Certo? E vou fazer: dois, três e já! Quando eu era pequeno era [DESCONHECIDO] Mais ou menos isso aqui que a gente está chamando, tá? Então, vou rodar aqui, vamos ver qual vai ser o meu carro aqui que vai ganhar, certo? Então rodei ali posso ver que o meu "CarroD" ali que tem a velocidade máxima de 140, acabou chegando primeiro ali. Tá? Vamos reduzir aqui para 130 para ver? Roda lá, né? Também ganhou! [SEM ÁUDIO] Vamos, deixa eu ver aqui, vamos botar 110 ali, para ficar iguais os carros. Roda. Opa, agora quem ganhou foi o "CarroD". Não acho que era o "CarroD" que estava ganhando, não estava vendo aqui a letra. Certo? Porque ele não necessariamente vai imprimir na ordem, né? Vamos manter o 140, vamos diminuir aqui o "CarroD", aqui, que está muito rápido. Vamos colocar aqui 120 nele. Agora, continua o "CarroD". 110 para você, "CarroD". E agora foi o "CarroB" que ganhou. Então, essa corrida ficou bem equilibrada. Então assim, o que é que é importante aqui nesse exemplo? Não é a nossa brincadeirinha da corrida, é a gente ver que independente do carro que eu chamo aqui, como a corrida está esperando aqui o carro de corrida, que é a superclasse, eu posso inclusive criar novo algoritmo de aceleração, com novo tipo de carro e passar para essa classe de corrida. Então essa que é a grande sacada da herança, né? É a gente justamente poder fazer isso, de passar qualquer classe que obedeça o contrato da minha superclasse, que no caso aqui é o carro de corrida. A gente vê que na hora que ele chama aqui o acelerar, a hora que ele pega o nome, ele não sabe se é carro soma ou carro multi que ele está pegando. Então, espero que com este exemplo tenha ficado claro aí essa questão da herança, essa questão do contrato da superclasse, do método classe abstrata, método abstrato, então tentamos fazer exemplo aí que pega toda essa, esses conceitos aí que a gente precisa quando a gente trabalha com a herança. Espero que tenha ficado bem claro para vocês isso e até ao próximo hands-on.