Programação (III) - Programação Orientada a Objetos (POO)
Este é o terceiro artigo da série sobre programação e vamos falar aqui sobre POO, que não é a melhor coisa do mundo, mas é o melhor que já vi para a programação nestes meus 25 anos no ramo.
Parte 9: Herança
Aqui está uma das maiores forças da POO: a capacidade de transmitir lógica de uma classe para outras através a herança.
Com isso fazemos com que nosso código seja melhor aproveitado, mais sintético e menos sujeito a erros. E quando os erros ocorrem, sabemos melhor onde encontrá-los.
Mas como estender uma classe? Simples! Vamos criar uma classe Cadeira, derivada da nossa classe Sentável.
Observe que não nos preocupamos em definir as funções que especificam o número de pernas e assentos da cadeira. Como ela descende de Sentavel, herdará essas funções!
Fantástico, não é? Codificamos apenas em Sentável e podemos espalhar aquelas funções em diversos lugares, definindo diversos objetos dentro do nosso sistema.
Da mesma forma que temos Cadeira descendendo de Sentável, poderíamos ter Sofá, Divã e até Puff! E não precisaríamos implementar tudo novamente, reinventando a roda a cada dia.
Isso fica ainda mais poderoso se levarmos em conta que nos domínios dos problemas práticos, lidamos com categorias de objetos que tem muitas formas e funcionalidades em comum. Por exemplo, um Cliente e um Fornecedor em um sistema são entidades diferentes, mas se pensarmos neles como pessoas, poderemos ter:
Colocando em Pessoas todas as coisas comuns, como por exemplo um endereço, evitaríamos a codificação dobrada nas duas classes herdeiras.
Com isso fazemos com que nosso código seja melhor aproveitado, mais sintético e menos sujeito a erros. E quando os erros ocorrem, sabemos melhor onde encontrá-los.
Mas como estender uma classe? Simples! Vamos criar uma classe Cadeira, derivada da nossa classe Sentável.
#ifndef __CADEIRA_H__
#define __CADEIRA_H__
#include "sentavel.h"
class Cadeira : Sentavel {
public:
Cadeira( int, int, bool );
~Cadeira();
bool tem_rodinhas();
private:
bool rodinhas;
void set_rodinhas( bool );
bool get_rodinhas();
};
#endif
#define __CADEIRA_H__
#include "sentavel.h"
class Cadeira : Sentavel {
public:
Cadeira( int, int, bool );
~Cadeira();
bool tem_rodinhas();
private:
bool rodinhas;
void set_rodinhas( bool );
bool get_rodinhas();
};
#endif
Observe que não nos preocupamos em definir as funções que especificam o número de pernas e assentos da cadeira. Como ela descende de Sentavel, herdará essas funções!
Fantástico, não é? Codificamos apenas em Sentável e podemos espalhar aquelas funções em diversos lugares, definindo diversos objetos dentro do nosso sistema.
Da mesma forma que temos Cadeira descendendo de Sentável, poderíamos ter Sofá, Divã e até Puff! E não precisaríamos implementar tudo novamente, reinventando a roda a cada dia.
Isso fica ainda mais poderoso se levarmos em conta que nos domínios dos problemas práticos, lidamos com categorias de objetos que tem muitas formas e funcionalidades em comum. Por exemplo, um Cliente e um Fornecedor em um sistema são entidades diferentes, mas se pensarmos neles como pessoas, poderemos ter:
class Pessoas {
}
class Clientes : Pessoas {
}
class Fornecedor : Pessoas {
}
}
class Clientes : Pessoas {
}
class Fornecedor : Pessoas {
}
Colocando em Pessoas todas as coisas comuns, como por exemplo um endereço, evitaríamos a codificação dobrada nas duas classes herdeiras.