[MÚSICA] Olá à todos!
Esse é o Curso de Desenvolvimento Ágil com Padrões de Projeto.
Estamos aqui no nosso módulo inicial,
onde a gente está fazendo uma revisão dos conceitos de orientação a objeto e
nessa aula vamos falar pouquinho sobre a herança.
A ideia, é a herança e a gente poder trabalhar com vários níveis de abstração.
Vamos ver como que isso aí funciona.
Então, dentro de sistema a gente pode ter as nossas abstrações,
como a gente viu lá quando a gente falou do conceito de abstração de dados.
Então imagina que, por exemplo, que eu tenho uma pessoa, mas,
por exemplo, alguns casos eu quero que aquela pessoa seja cliente,
ela tenha umas informações a mais, tenha comportamento a mais.
Então, por exemplo, se eu estou lidando, por exemplo, com pagamento,
eu tenho que lidar com cliente, mas, por exemplo, eu posso ter pessoas que são
funcionários, por exemplo, da minha empresa e também são pessoas.
Se eu estou fazendo uma lista de aniversariantes que eu vou incluir todas
as pessoas do meu sistema, nesse caso eu posso,
eu não posso pegar só cliente, eu tenho que pegar uma coisa
mais abstrata que cliente, que é o conceito de pessoa.
A questão é que as vezes eu, o cliente ele também é uma pessoa,
então às vezes o meu sistema tem que ver ele como uma pessoa,
às vezes o meu sistema tem que ver ele como cliente.
Então, o que é que é herança?
A herança é a gente poder definir essas abstrações
diversos níveis onde nível pode herdar características de outro.
Então nesse exemplo que eu dei da herança, do cliente, da pessoa,
eu tenho uma abstração que é a pessoa e eu tenho a abstração cliente que
ela é mais específica do que a abstração pessoa, é diferente da relação
entre classe e objeto, que é uma coisa abstrata e uma coisa concreta.
Não, aqui eu tenho abstrações que são mais gerais e mais
específicas e dependendo do meu sistema, às vezes a mesma entidade,
eu preciso trabalhar com diversos desses níveis.
Então foi por isso que eu falei lá na primeira aula desse módulo,
que a orientação a objetos, ela estruturou também os conceitos,
porque ele não só simplesmente criou uma abstração de dados, mas você também pode
definir vários níveis para organizar o conhecimento dentro do seu sistema.
Então imagina o seguinte, eu tenho aqui carro e aí eu posso ter
conceito mais abstrato, que é, por exemplo, transporte terrestre,
que incluiria aí talvez caminhão, uma moto, até trem,
de repente e eu teria ali, por exemplo, mais concreto que o carro,
que seria tipo específico de carro, seria, por exemplo, uma SUV.
Ainda são abstrações, só que pode ser uma coisa mais abstrata ou menos abstrata,
mas todos são abstrações.
Então imagina por exemplo que eu preciso uma funcionalidade
ali da velocidade máxima, da velocidade média,
de repente para calcular tempo de viagem, alguma coisa assim.
Eu posso por exemplo considerar transporte terrestre de uma forma mais genérica.
Agora, por exemplo, eu estou alocando carga, de repente ali,
a minha SUV, ela tem ali, alguma funcionalidade mais específica,
por caber mais coisas que às vezes que carro normal e ali eu preciso,
por exemplo, estar utilizando a abstração mais baixa ali do código.
Indo ali para exemplo pouco mais voltado para computação,
eu vou até sair aqui para você poder ver melhor.
Imagina o seguinte, que eu tenha ali uma abstração Connection,
que está representando uma conexão e eu tenha ali, por exemplo,
a NetworkConnection que está representando uma conexão de rede e o DatabaseConnection
que está representando uma conexão com o banco de dados.
E, por exemplo,
dentro ali da NetworkConnection, que é a conexão ali com a rede,
eu tenho ali a EncryptedNetworkConnection e a CompressedNetworkConnection,
sendo que a Encrypted seria uma comunicação criptografada e
a Compressed ele vai comprimir os dados antes e depois de estar enviando.
Só que é o seguinte, eu tenho uma outra abstração ali, que seria uma interface,
a Expirable, ou seja, são coisas que podem expirar.
Então no caso da conexão, se ela ficar muito tempo sem ser utilizada ela
pode expirar, por outro lado eu posso ter conceito completamente diferente,
que é leilão, por exemplo, que ele também pode expirar, então olha que engraçado,
eu tenho leilão e tenho uma conexão que tem uma abstração ali comum,
ou seja, eu falo, olha, às vezes, por exemplo,
para método, basta saber que alguma coisa é expirável.
Ele consegue trabalhar, seja uma conexão, seja leilão e da
mesma forma às vezes uma conexão também eu consigo aí trabalhar de diferentes formas.
Aí eu vou aproveitar para trazer uma questão aí que me perguntam bastante,
mas quando eu uso uma interface, quando eu uso uma classe?
Normalmente a minha resposta não é muito técnica, eu falo o seguinte: olha, usa
aí uma interface quando o que você está abstraindo é referente a comportamento,
ou seja, no caso aqui, o Expirable,
ele é comportamento, é o comportamento de alguma coisa que se expira,
alguma coisa que acaba, que tem uma validade,
alguma coisa assim, que algum momento do tempo vai acabar.
Por outro lado, eu posso ter ali a classe,
eu utilizo mais quando, ou seja, no caso ali a herança com classe,
eu utilizo mais quando a minha abstração é conceito, então, por exemplo,
a conexão, a conexão aqui, ela é conceito, é uma coisa.
De repente se eu tivesse conectável, já seria comportamento,
mas a conexão ela é conceito.
Então eu normalmente faço esse tipo de distinção principalmente quando eu estou
com dúvida, se eu, " isso aí vai ser uma interface ou vai ser uma classe abstrata,
ou uma superclasse?" Eu sempre vejo, é conceito ou é comportamento?
E aí eu obviamente eu sempre tento dar a preferência à abstrair
comportamento sempre que possível, certo?
Então é isso, a gente viu aí o conceito de herança, como que ela pode
ser utilizada para definir esses vários níveis de abstração.
Herança é uma das coisas, assim, básicas da orientação a objetos,
tenho certeza que todo mundo aí que está programando uma orientada,
alguma linguagem orientada a objetos sabe fazer herança,
mas muito pouca gente ás vezes tem essas noção, tem essa visão de que
isso é uma forma de você trabalhar diferentes níveis de abstração.
Então, espero que a aula de repente tenha te dado uma visão diferente
ali da herança e que isso te ajude a utilizá-la de uma forma mais eficiente.
Nos padrões vamos falar bastante de herança aí também.
Certo?
Então, muito obrigado, aguardo vocês na última aula desse módulo.
[MÚSICA]
[SEM SOM]