11.1 Repetindo Código?

Como toda empresa, nosso banco possui funcionários. Um funcionário tem um nome, um cpf e um salário. Vamos modelar a classe Funcionario :

class Funcionario:
python
def __init__(self, nome, cpf, salario): self._nome = nome
 
self._cpf = cpf self._salario = salario
 
# outros métodos e propriedades
 

Além de um funcionário comum, há também outros cargos, como os gerentes. Os gerentes guardam a mesma informação que um funcionário comum, mas possuem outras informações, além de ter funcionalidades um pouco diferentes. Um gerente no nosso banco possui também uma senha numérica que permite o acesso ao sistema interno do banco, além do número de funcionários que ele gerencia:

class Gerente:
python
def __init__(self, nome, cpf, salario, senha, qtd_gerenciados): self._nome = nome
 
self._cpf = cpf self._salario = salario self._senha = senha
 
self._qtd_gerenciados = qtd_gerenciados
 
python
def autentica(self, senha): if self._senha == senha:
python
print("acesso permitido") return True
java
else:
 
java
print("acesso negado") return False

outros métodos (comuns a um Funcionario)

Se tivéssemos um outro tipo de funcionário que tem características diferentes do funcionário comum, precisaríamos criar uma outra classe e copiar o código novamente.

Além disso, se um dia precisarmos adicionar uma nova informação para todos os funcionários, precisaremos passar por todas as classes de funcionário e adicionar esse atributo. O problema acontece novamente por não centralizarmos as informações principais do funcionário em um único lugar!

Existe um jeito de relacionarmos uma classe de tal maneira que uma delas herda tudo que o outra tem. Isto é uma relação de herança, uma relação entre classe ‘mãe’ e classe ‘filha’. No nosso caso, gostaríamos de fazer com que Gerente tivesse tudo que um Funcionario tem, gostaríamos que ela fosse uma extensão de Funcionario . Fazemos isso acrescentando a classe mãe entre parenteses junto a classe filha:

class Gerente(Funcionario):
python
def __init__(self, senha, qtd_funcionarios): self._senha = senha self._qtd_funcionarios = qtd_funcionarios
 
python
def autentica(self, senha): if self._senha == senha:
python
print("acesso permitido") return True
java
else:
 
java
print("acesso negado") return False

Todo momento que criarmos um objeto do tipo Gerente queremos que este objeto também herde os atributos definidos na classe Funcionario , pois um Gerente é um Funcionário.

Como a classe Gerente já possui um método init () com outros atributos, o método da classe Funcionario é sobrescrito pelo Gerente . Se queremos incluir os mesmos atributos de instância de Funcionario em um Gerente , devemos chamar o método init () de Funcionario dentro do método init () de Gerente:

class Gerente(Funcionario):
python
def __init__(self, senha, qtd_funcionarios): Funcionario. init (nome, cpf, salario) self._senha = senha self._qtd_funcionarios = qtd_funcionarios
 
python
def autentica(self, senha): if self._senha == senha:
python
print("acesso permitido") return True
java
else:
 
java
print("acesso negado") return False

Dizemos que a classe Gerente herda todos os atributos e métodos da classe mãe, no nosso caso, a Funcionario . Como Python tem tipagem dinâmica, precisamos garantir isso através do construtor da classe. Além de senha e qtd_funcionarios passamos também os atributos nome , cpf e salario que todo funcionário tem:

class Gerente(Funcionario):
python
def __init__(self, nome, cpf, salario, senha, qtd_funcionarios): self._senha = senha
 
self._qtd_funcionarios = qtd_funcionarios
 

Como estes são atributos de um Funcionario e não queremos repetir o código do método

init () de Funcionario dentro da classe Gerente , podemos chamar este método da classe mãe como fizemos no exemplo acima ou podemos utilizar um método do Python chamado super():

class Gerente(Funcionario):
python
def __init__(self, nome, cpf, salario, senha, qtd_funcionarios): super(). init (nome, cpf, salario)
 
self._senha = senha self._qtd_funcionarios = qtd_funcionarios
 
Para ser mais preciso, ela também herda os atributos e métodos 'privados' de Funcionario . O super() é usado para fazer referência a superclasse, a classe mãe - no nosso exemplo a classe Funcionario .
 
PARA SABER MAIS: SUPER E SUB CLASSE
 

A nomenclatura mais encontrada é que Funcionario é a superclasse de Gerente, e Gerente é a subclasse de Funcionario. Dizemos também que todo Gerente é um Funcionario. Outra forma é dizer que Funcionario é a classe mãe de Gerente e Gerente é a classe filha de Funcionario.

Da mesma maneira, podemos ter uma classe Diretor que estenda Gerente , e a classe Presidente pode estender diretamente de Funcionario . Fique claro que essa é uma relação de negócio. Se Diretor vai estender de Gerente ou não, vai depender, para você, Diretor é um Gerente ?


⬅️ Capítulo Anterior | Próximo Capítulo ➡️