Projeto Prático: Hierarquia de Funcionários

Neste projeto, vamos criar um sistema de hierarquia de funcionários usando os conceitos de herança, atributos e métodos em Python. O objetivo é aplicar os princípios da Programação Orientada a Objetos para estruturar uma organização fictícia.

Passo 1: Definir a Classe Base Funcionario

Vamos começar por definir uma classe base chamada Funcionario. Esta classe terá alguns atributos comuns a todos os funcionários, como nome e salário.

class Funcionario:
    def __init__(self, nome, salario):  # Método de instância
        self.nome = nome
        self.salario = salario
        
    def mostrar_informacoes(self):  # Método de instância
        return f'Nome: {self.nome}, Salário: {self.salario}'

    @classmethod
    def criar_com_salario_base(cls, nome):  # Método de classe
        return cls(nome, 1500)

Passo 2: Criar Subclasses Específicas

Vamos criar subclasses para diferentes tipos de funcionários: Manager e Tecnico.

Classe Manager

A classe Manager herda de Funcionario. Adicionamos um atributo extra para o departamento que o gerente supervisiona.

class Manager(Funcionario):
    def __init__(self, nome, salario, departamento):
        super().__init__(nome, salario)
        self.departamento = departamento
    
    def mostrar_informacoes(self):
        info_basica = super().mostrar_informacoes()
        return f'{info_basica}, Departamento: {self.departamento}'

Classe Tecnico

A classe Tecnico também herda de Funcionario. Adicionamos um atributo para a especialidade do técnico.

class Tecnico(Funcionario):
    def __init__(self, nome, salario, especialidade):
        super().__init__(nome, salario)
        self.especialidade = especialidade

    def mostrar_informacoes(self):
        info_basica = super().mostrar_informacoes()
        return f'{info_basica}, Especialidade: {self.especialidade}'

Passo 3: Adicionar Métodos Específicos

Cada classe pode ter métodos específicos que são exclusivos para o tipo de funcionário.

Na classe Tecnico, podemos adicionar um método para mostrar a especialidade:

class Tecnico(Funcionario):
    def __init__(self, nome, salario, especialidade):
        super().__init__(nome, salario)
        self.especialidade = especialidade

    def mostrar_informacoes(self):
        info_basica = super().mostrar_informacoes()
        return f'{info_basica}, Especialidade: {self.especialidade}'
    
    def realizar_tarefa(self, tarefa):
        return f'{self.nome} está a realizar {tarefa} usando a sua especialidade: {self.especialidade}'

Passo 4: Criar Instâncias e Testar

Vamos criar algumas instâncias das nossas classes e testar os métodos para garantir que tudo está a funcionar corretamente.

# Criando instâncias
funcionario1 = Funcionario.criar_com_salario_base("Alice")
gerente1 = Manager("Bob", 3000, "Vendas")
tecnico1 = Tecnico("Carlos", 2000, "Redes")

# Mostrando informações
print(funcionario1.mostrar_informacoes())  # Output: Nome: Alice, Salário: 1500
print(gerente1.mostrar_informacoes())  # Output: Nome: Bob, Salário: 3000, Departamento: Vendas
print(tecnico1.mostrar_informacoes())  # Output: Nome: Carlos, Salário: 2000, Especialidade: Redes

# Realizando uma tarefa
print(tecnico1.realizar_tarefa("instalação de servidor"))  # Output: Carlos está a realizar instalação de servidor usando a sua especialidade: Redes

Resumo

Neste capítulo, aplicámos o conceito de herança para criar uma hierarquia de funcionários em Python, utilizando classes, atributos e métodos. Vimos como é possível estender funcionalidades de classes base para subclasses e adicionar métodos específicos.

Quiz

  1. O que acontece quando chamamos o método self.mostrar_informacoes() em uma subclasse que herda de Funcionario?

    • a) Chamamos o método da classe base.
    • b) Chamamos o método mostrar_informacoes da subclasse, se tiver sido sobrescrito.
    • c) Ambos, dependendo de como o método é implementado.
  2. Como definimos um método de classe em Python?

    • a) Utilizando o decorador @classmethod.
    • b) Utilizando o decorador @staticmethod.
    • c) Utilizando o decorador @property.
  3. Qual é a função do método super() numa subclasse?

    • a) Permitir que a subclasse aceda aos métodos e atributos da classe base.
    • b) Criar um método estático.
    • c) Aumentar o salário dos funcionários.
  4. Na classe Tecnico, o que faz o método realizar_tarefa?

    • a) Aumenta o salário do técnico.
    • b) Mostra as tarefas que o técnico pode realizar.
    • c) Descreve uma tarefa específica que o técnico está a realizar.
<< Sobrescrita de Métodos Índice Polimorfismo >>