{"id":28209663,"url":"https://github.com/juletopi/poo_programacao_orientada_a_objetos","last_synced_at":"2025-06-10T21:31:28.463Z","repository":{"id":221608839,"uuid":"754876085","full_name":"juletopi/POO_Programacao_Orientada_a_Objetos","owner":"juletopi","description":"🧩 • Repositório back-end com os conteúdos de Programação Orientada a Objetos, utilizando o Visual Studio e a linguagem CSharp como ferramentas de aprendizado.","archived":false,"fork":false,"pushed_at":"2024-09-04T22:35:24.000Z","size":7939,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-17T16:14:59.365Z","etag":null,"topics":["abstraction","back-end","backend","classes","csharp","encapsulation","inheritance","methods","object-oriented-programming","objects","polymorphism","programacao-orientada-objetos","visual-studio"],"latest_commit_sha":null,"homepage":"https://github.com/Elias-abreu","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/juletopi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-02-08T23:32:42.000Z","updated_at":"2024-10-05T19:10:13.000Z","dependencies_parsed_at":"2024-02-09T01:14:50.092Z","dependency_job_id":"81374f4a-18c6-4650-844c-7bc1feb0016d","html_url":"https://github.com/juletopi/POO_Programacao_Orientada_a_Objetos","commit_stats":null,"previous_names":["juletopi/poo_-programacao_orientada_a_objetos-"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juletopi%2FPOO_Programacao_Orientada_a_Objetos","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juletopi%2FPOO_Programacao_Orientada_a_Objetos/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juletopi%2FPOO_Programacao_Orientada_a_Objetos/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juletopi%2FPOO_Programacao_Orientada_a_Objetos/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/juletopi","download_url":"https://codeload.github.com/juletopi/POO_Programacao_Orientada_a_Objetos/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juletopi%2FPOO_Programacao_Orientada_a_Objetos/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259154333,"owners_count":22813577,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["abstraction","back-end","backend","classes","csharp","encapsulation","inheritance","methods","object-oriented-programming","objects","polymorphism","programacao-orientada-objetos","visual-studio"],"created_at":"2025-05-17T16:12:59.568Z","updated_at":"2025-06-10T21:31:28.450Z","avatar_url":"https://github.com/juletopi.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!--\n❗ ➤ References used in this Repository:\n🔗 • https://github.com/piyushsuthar/github-readme-quotes\n🔗 • https://github.com/kyechan99/capsule-render\n🔗 • https://github.com/DenverCoder1/custom-icon-badges\n🔗 • https://profilepicturemaker.com\n🔗 • https://shields.io\n🔗 • https://emoji.gg\n🔗 • https://getemoji.com\n--\u003e\n\n\u003cdiv align=\"left\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/license/juletopi/POO_Programacao_Orientada_a_Objetos\" alt=\"Licence-badge\"\u003e\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n\u003c!-- PRESENTATION --\u003e\n\n\u003cdiv align=\"center\"\u003e\n    \u003ca href=\"https://github.com/juletopi/POO_Programacao_Orientada_a_Objetos/blob/main/Assets/POO-pic.png\"\u003e\n        \u003cimg src=\"https://github.com/juletopi/POO_Programacao_Orientada_a_Objetos/assets/76459155/3bc0342c-d326-42c2-a8e3-502805e413d9\" alt=\"POO-pic\" width=\"130px\" title=\"Repositório de Programação Orientada a Objetos\"\u003e\n    \u003c/a\u003e\n    \u003ch2 align=\"center\"\u003eProgramação Orientada a Objetos 🧩\u003c/h2\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n \n  • Este é um repositório com o conteúdo das aulas de Programação Orientada a Objetos, \\\n  ministradas pelo professor [**Elias de Abreu**](https://www.linkedin.com/in/elias-de-abreu-domingos-da-silva-843748262/), utilizando o **Visual Studio**, linguagem \\\n  **CSharp** e framework **.NET Framework** como ferramentas de aprendizado.\n \n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://visualstudio.microsoft.com/\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Made%20with%20IDE:-Visual%20Studio%20-gray.svg?colorA=655BE1\u0026amp;colorB=4F44D6\u0026amp;style=for-the-badge\" alt=\"VisualStudioIDE-badge\" style=\"max-width: 100%;\"\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://dotnet.microsoft.com/en-us/languages/csharp\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Made%20with%20language:-CSharp%20-gray.svg?colorA=61c265\u0026amp;colorB=4CAF50\u0026amp;style=for-the-badge\" alt=\"CSharpLanguage-badge\" style=\"max-width: 100%;\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://learn.microsoft.com/en-us/dotnet/core/introduction\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Made%20with%20Framework:-.NET%20Framework-gray.svg?colorA=8731AB\u0026amp;colorB=6C2D93\u0026amp;style=for-the-badge\" alt=\"NETFramework-badge\" style=\"max-width: 100%;\"\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\n\u003c!-- SUMMARY --\u003e\n\n\u003ch2 align=\"center\"\u003eSumário 🧾\u003c/h2\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cp align=\"center\"\u003e\n    \u003ca href=\"#-professor\"\u003eProfessor\u003c/a\u003e \u0026#xa0; | \u0026#xa0;\n    \u003ca href=\"#-programação-orientada-a-objetos-poo\"\u003eSobre o tópico\u003c/a\u003e \u0026#xa0; | \u0026#xa0;\n    \u003ca href=\"#1-classes-objetos-e-métodos\"\u003eConceitos Aprendidos 1\u003c/a\u003e \u0026#xa0; | \u0026#xa0;\n    \u003ca href=\"#2-listas-e-classes\"\u003eConceitos Aprendidos 2\u003c/a\u003e\n   \u003c/p\u003e\n    \u003ca href=\"#3-revisão-de-poo-1\"\u003eRevisão de P.O.O 1\u003c/a\u003e \u0026#xa0; | \u0026#xa0;\n    \u003ca href=\"#4-revisão-de-poo-2\"\u003eRevisão de P.O.O 2\u003c/a\u003e \u0026#xa0; | \u0026#xa0;\n    \u003ca href=\"#5-revisão-de-poo-3\"\u003eRevisão de P.O.O 3\u003c/a\u003e \u0026#xa0; | \u0026#xa0;\n    \u003ca href=\"#6-revisão-de-poo-4\"\u003eRevisão de P.O.O 4\u003c/a\u003e\n  \u003c/p\u003e\n    \u003ca href=\"#7-conexão-com-mysql-em-poo\"\u003eConexão com MySQL em P.O.O\u003c/a\u003e \u0026#xa0; | \u0026#xa0;\n    \u003ca href=\"#-autor\"\u003eAutor\u003c/a\u003e\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg width=100% align=\"center\" src=\"https://capsule-render.vercel.app/api?type=rect\u0026color=8354d2\u0026height=4\u0026section=header\u0026%20render\"\u003e\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n  [![Readme Quotes](https://quotes-github-readme.vercel.app/api?type=horizontal\u0026theme=dracula\u0026quote=Programa%C3%A7%C3%A3o%20Orientada%20a%20Objetos%20%C3%A9%20como%20uma%20caixa%20de%20ferramentas%2C%20onde%20cada%20objeto%20%C3%A9%20uma%20ferramenta%20especializada%2C%20pronta%20para%20ser%20usada%20na%20constru%C3%A7%C3%A3o%20de%20um%20grande%20projeto.\u0026author=Autor%20Desconhecido)](https://github.com/piyushsuthar/github-readme-quotes)\n\u003c/div\u003e\n\n\u003c!-- ABOUT TEACHER --\u003e\n\n## 👨‍🏫 Professor:\n\n\u003ca href=\"https://github.com/juletopi/POO_Programacao_Orientada_a_Objetos/blob/main/Assets/EliasAbreu-pic.png\"\u003e\n  \u003cimg align=\"left\" height=\"135px\" width=\"135px\" alt=\"EliasAbreu-pic\" title=\"Professor Elias de Abreu\" src=\"https://github.com/juletopi/POO_Programacao_Orientada_a_Objetos/assets/76459155/9f7a51ff-83bf-4d2c-8686-9e2abe230977\"\u003e\n\u003c/a\u003e\n\n  **Elias de Abreu Domingos da Silva - Entusiasta em T.I. | Perito Criminal na Área da Informática | Professor de Curso Técnico e Superior** \\\n  [**IFRO Campus Ji-Paraná**](https://portal.ifro.edu.br/ji-parana) • \u003ci\u003eAtuando desde Dezembro de 2017\u003c/i\u003e \\\n  Linguagens \u0026 Tecnologias: `Visual Studio` • `MySQL` • `C#` • `PHP` • `Java` • `E outros...` \\\n  Contato: **[Elias de Abreu (LinkedIn)](https://www.linkedin.com/in/elias-de-abreu-domingos-da-silva-843748262/)**\n\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg width=100% align=\"center\" src=\"https://capsule-render.vercel.app/api?type=rect\u0026color=8354d2\u0026height=4\u0026section=header\u0026%20render\"\u003e\n\u003c/div\u003e\n\n\u003c!-- ABOUT TOPIC --\u003e\n\n## 🌟 Programação Orientada a Objetos (P.O.O)\n\n### ❓ O que é isso?\n\nA Programação Orientada a Objetos (P.O.O) é uma maneira de escrever código pensando em objetos interconectados, cada um com suas próprias características e habilidades. Isso nos ajuda a organizar o código de forma lógica, dividindo-o em classes e objetos. \n\n### 📋 Principais Conceitos\n\n- **🧩 Classe**: É um modelo para criar \"objetos\", especificando os \"atributos\" e \"métodos\" que os objetos terão.\n  - **🔖 Atributos**: São as características ou propriedades de uma classe. Eles definem o estado ou dados que os objetos dessa classe podem ter.\n  - **🔍 Objeto**: É uma \"instância\" de uma classe que representa uma entidade específica com dados e funcionalidades definidos pela classe.\n  - **📦 Instância**: É um objeto concreto criado a partir de uma classe. Cada instância de uma classe pode ter diferentes valores para seus atributos, mesmo que compartilhem a mesma estrutura e comportamento definidos pela classe.\n\n- **⚙️ Métodos**: São as ações que um objeto pode realizar, definidos dentro das classes. Eles podem receber parâmetros, realizar operações e retornar valores, permitindo que os objetos interajam entre si e com o ambiente. Tipos especiais de métodos são \"Método Construtor\" e \"Método Virtual\".\n  - **🏗️ Método Construtor**: É um tipo especial de método que é chamado automaticamente quando uma nova instância de uma classe é criada. Ele tem o mesmo nome da classe, não possui tipo de retorno, e seu principal objetivo é inicializar os atributos do objeto. Os construtores podem ser \"sobrecarregados\", ou seja, pode haver mais de um construtor com diferentes parâmetros na mesma classe.\n  - **🔄 Sobrecarga de Método**: É uma característica que permite que uma classe tenha mais de um método com o mesmo nome, mas com diferentes assinaturas (número ou tipo de parâmetros). A sobrecarga de método facilita a criação de métodos que executam funções similares, mas com diferentes tipos ou números de parâmetros.\n  - **🌀 Método Virtual**: São métodos definidos em uma classe base que podem ser substituídos por métodos nas classes derivadas. Eles permitem que as classes derivadas forneçam uma implementação específica para o método. Em P.O.O, classes bases e classes derivadas são um conceito de \"herança\".\n\n- **⚠️ Exceções**: São mecanismos para lidar com erros que ocorrem durante a execução do programa. Exceções permitem que o programa continue rodando, mesmo quando erros imprevistos acontecem. Elas são tratadas usando blocos try-catch.\n- **🧬 Herança**: Permite que uma classe herde características de outra, evitando repetição de código.\n- **🔒 Encapsulamento**: Esconde partes do código e permite acesso apenas por métodos específicos.\n- **🔀 Polimorfismo**: Permite que diferentes objetos podem ser tratados de maneira uniforme, mesmo sendo de classes diferentes.\n- **📝 Abstração**: É o processo de identificar as características essenciais de um objeto, ignorando os detalhes irrelevantes. Isso é feito definindo classes que encapsulam o comportamento e estado das entidades do mundo real.\n\n---\n\nP.O.O torna o código mais organizado, fácil de entender e reutilizável, principalmente em programas maiores e mais complexos onde há centenas e centenas de linhas de código. É como se tivéssemos uma pilha de roupas e as separássemos em um armário com cada compartimento para um tipo de roupa diferente, assim conseguimos nos organizar melhor ao trabalharmos com programação.\n\n\u003cdiv align=\"left\"\u003e\n  \u003ch6\u003e\u003ca href=\"#programação-orientada-a-objetos-\"\u003e Voltar para o início ↺\u003c/a\u003e\u003c/h6\u003e\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg width=100% align=\"center\" src=\"https://capsule-render.vercel.app/api?type=rect\u0026color=8354d2\u0026height=4\u0026section=header\u0026%20render\"\u003e\n\u003c/div\u003e\n\n\u003c!-- LEARNED CONCEPTS --\u003e\n\n## 📚 Conceitos Aprendidos:\n\n### 1. Classes, Objetos e Métodos\n\n\u003e [!NOTE]\\\n\u003e *Retirado da aula de \"[Software_de_Gerenciamento_(POO)](https://github.com/juletopi/POO_Programacao_Orientada_a_Objetos/blob/main/Software_de_Gerenciamento_(POO)/Program.cs)\"*\n\n\u003cdiv align=\"left\"\u003e\n\n  Nesta aula foram aprendidos:\n  - Conceitos básicos para a criação de Classes\n  - Conceitos básicos para a criação de Objetos\n  - Criação de Métodos na mesma instância das Classes\n \n\u003c/div\u003e\n  \n```c#\npublic class Funcionario // \u003c-- Criação da Classe \"Funcionário\"\n{\n    public string nome; \n    public string cpf;\n    public string email;\n    public string senhaAcesso;\n    public DateTime dataNascimento;\n    public string sexo;\n\n    public int CalcularIdade() // \u003c-- Criação dum Método que calcula a idade do funcionário\n    {\n        DateTime dataAtual = DateTime.Today;\n        int idade = dataAtual.Year - dataNascimento.Year;\n\n        if (dataAtual \u003c dataNascimento.AddYears(idade))\n        {\n            idade--;\n        }\n\n        return idade;\n    }\n}\n\nstatic void Main(string[] args) // \u003c-- Main program\n{\n    // SOFTWARE DE GERENCIAMENTO - APRENDENDO A FAZER CLASSES E ATRIBUTOS\n\n    // A empresa \"Plugar Tecnologia\" deseja desenvolver um software para gerenciar os serviços oferecidos aos clientes.\n    // Para isso, é necessário cadastrar os clientes com os seguintes dados: Nome, CPF, Data de Nascimento e Sexo.\n    // Também é necessário cadastrar os funcionários com: Nome, CPF, E-mail, Senha de Acesso, Data de Nascimento e Sexo.\n    // Cada serviço serviço possui: Um código, Nome, Valor Estimado, Garantias e o Tempo Estimado para a realização.\n\n    // Um caixa tem um dos serviços oferecidos aos clientes em forma de vendas, cada venda tem uma Data, Horário,\n    // Valor Total, Cliente, os Serviços Oferecidos e um Caixa de ata de abertura, uma Data de Fechamento,\n    // um Funcionário Responsável, Valor de Abertura, Status (Aberto ou Fechado) e o Saldo Final.\n\n    // -------------------------------------------------------------------------------\n\n    Funcionario f1 = new Funcionario(); // \u003c-- Criando um novo objeto para a classe e atribuindo valores\n    f1.nome = \"Bernado\";\n    f1.cpf = \"011.900.605-12\";\n    f1.email = \"bernadin1101@gmail.com\";\n    f1.senhaAcesso = \"090001\";\n    f1.dataNascimento = new DateTime(1998, 11, 01);\n    f1.sexo = \"M\";\n    int idade = f1.CalcularIdade();\n\n    Console.Write(\"\\r\\n ┌────────────────────────────────────────┐\");\n    Console.Write(\"\\r\\n │ Calculando a idade dos funcionários... │\");\n    Console.Write(\"\\r\\n └────────────────────────────────────────┘\\r\\n\");\n\n    Console.WriteLine($\" A idade do(a) funcionário(a) {f1.nome} é {idade} anos.\");\n\n    Funcionario f2 = new Funcionario();\n    f2.nome = \"Túlio\";\n    f2.cpf = \"073.743.623-24\";\n    f2.email = \"tuliomurilo03@gamil.com\";\n    f2.senhaAcesso = \"090002\";\n    f2.dataNascimento = new DateTime(2003, 01, 17);\n    f2.sexo = \"M\";\n    idade = f2.CalcularIdade();\n    Console.WriteLine($\" A idade do(a) funcionário(a) {f2.nome} é {idade} anos.\");\n\n    Funcionario f3 = new Funcionario();\n    f3.nome = \"Letícia\";\n    f3.cpf = \"061.807.612-14\";\n    f3.email = \"kirbystar99@gmail.com\";\n    f3.senhaAcesso = \"090003\";\n    f3.dataNascimento = new DateTime(2000, 01, 30);\n    f3.sexo = \"F\";\n    idade = f3.CalcularIdade();\n    Console.WriteLine($\" A idade do(a) funcionário(a) {f3.nome} é {idade} anos.\");\n\n    Console.ReadKey();\n}\n```\n\u003cdiv align=\"left\"\u003e\n  \u003ch6\u003e\u003ca href=\"#programação-orientada-a-objetos-\"\u003e Voltar para o início ↺\u003c/a\u003e\u003c/h6\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg width=100% align=\"center\" src=\"https://capsule-render.vercel.app/api?type=rect\u0026color=8354d2\u0026height=4\u0026section=header\u0026%20render\"\u003e\n\u003c/div\u003e\n\n### 2. Listas e Classes\n\n\u003e [!NOTE]\\\n\u003e *Retirado da aula de \"[Cadastro_de_Alunos_(POO)](https://github.com/juletopi/POO_Programacao_Orientada_a_Objetos/blob/main/Cadastro_de_Alunos_(POO)/Program.cs)\"*\n\n\u003cdiv align=\"left\"\u003e\n\n  Nesta aula foram aprendidos:\n  - Implementação de listas simples na criação de classes, objetos e atributos\n \n\u003c/div\u003e\n  \n```c#\npublic class Aluno // \u003c-- Criação da classe \"Aluno\"\n{\n    public string nome;  // \u003c-- Atributo para armazenar o nome do aluno\n    public string cpf;   // \u003c-- Atributo para armazenar o CPF do aluno\n    public string email; // \u003c-- Atributo para armazenar o email do aluno\n}\n\nstatic void Main(string[] args)\n{\n    // CADASTRO DE ALUNO - IMPLEMENTANDO LISTAS NA CRIAÇÃO DE CLASSES E ATRIBUTOS\n\n    // Faça um algoritmo de \"Cadastro de Alunos\". Nesse algoritmo terá uma interação com o usuário\n    // onde será perguntado se ele deseja cadastrar um aluno com Nome, CPF e Email até que ele\n    // selecione que não deseja mais cadastrar nenhum aluno, assim finalizando o cadastro e\n    // mostrando uma lista de todos cadastrados com seus respectivos Nomes, CPFs e Emails.\n\n    // -------------------------------------------------------------------------------\n\n    List\u003cAluno\u003e alunos = new List\u003cAluno\u003e(); // \u003c-- Lista para armazenar os alunos cadastrados\n\n    Console.Write(\"\\r\\n ┌────────────────────┐\");\n    Console.Write(\"\\r\\n │ Cadastro de Alunos │\");\n    Console.Write(\"\\r\\n └────────────────────┘\\r\\n\");\n\n    while (true)\n    {\n        Console.WriteLine(\"\\n Deseja cadastrar um aluno? (s/n)\");\n        string resposta = Console.ReadLine();\n\n        if (resposta.ToLower() != \"s\")\n        {\n            break;\n        }\n\n        Aluno aluno = new Aluno(); // \u003c-- Cria um novo objet \"Aluno\"\n\n        Console.Write(\"\\n Nome do(a) aluno: \");\n        aluno.nome = Console.ReadLine();\n\n        Console.Write(\" CPF do aluno: \");\n        aluno.cpf = Console.ReadLine();\n\n        Console.Write(\" Email do aluno: \");\n        aluno.email = Console.ReadLine();\n\n        alunos.Add(aluno); // \u003c-- Adiciona o aluno à lista de alunos cadastrados\n    }\n\n    Console.WriteLine(\"\\r\\n -----------------------------------------\");\n    Console.Write(\"\\r\\n ┌──────────────────────────────┐\");\n    Console.Write(\"\\r\\n │ Lista de alunos cadastrados: │\");\n    Console.Write(\"\\r\\n └──────────────────────────────┘\\r\\n\");\n    foreach (var aluno in alunos) // Para cada aluno na lista de alunos cadastrados...\n    {\n        Console.WriteLine($\"\\n Nome: {aluno.nome}, CPF: {aluno.cpf}, Email: {aluno.email}\"); // ...exibe na tela o nome, CPF e email do aluno\n    }\n    Console.WriteLine(\"\\r\\n -----------------------------------------\");\n    Console.ReadKey();\n}\n\n```\n\u003cdiv align=\"left\"\u003e\n  \u003ch6\u003e\u003ca href=\"#programação-orientada-a-objetos-\"\u003e Voltar para o início ↺\u003c/a\u003e\u003c/h6\u003e\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \n| \u003ch3 align=\"center\"\u003e⚠️ AVISO\u003c/h3\u003e |\n|:---------------------------------|\n| \u003cp\u003e\u003cdiv align=\"center\"\u003eA partir deste ponto em diante, devido a greve das \u003cbr\u003euniversidades federais em 2024, o conteúdo da disciplina será reestudado. \u003c/p\u003e |\n\n\u003c/div\u003e\n\u003cbr\u003e\n\n### 3. Revisão de P.O.O 1\n\n\u003e [!NOTE]\\\n\u003e *Retirado da aula de \"[RevisaoPOO](https://github.com/juletopi/POO_Programacao_Orientada_a_Objetos/tree/main/RevisaoPOO)\"*\n\n\u003cdiv align=\"left\"\u003e\n\n  - Nesta aula foram revisionados os \"conceitos básicos\" de P.O.O:\n    - Classes, Objetos e Atributos\n    - Visibilidade (Modificador de Acesso)\n    - Métodos e Métodos Construtores\n    - Encapsulamento (Get e Set)\n \n\u003c/div\u003e\n  \n```c#\npublic class Aluno // \u003c-- Classe \"Aluno\"\n{\n    // Atributos da classe \"Aluno\"\n    public string nome; // \u003c-- Nome do aluno\n    public DateTime dataNasc; // \u003c-- Data de nascimento do aluno\n    public int idade; // \u003c-- Idade do aluno\n\n    // Método construtor da classe \"Aluno\"\n    public Aluno(string nome, DateTime dataNasc) \n    {\n        this.nome = nome; // \u003c-- Parâmetro do atributo \"nome\"\n        this.dataNasc = dataNasc; // \u003c-- Parâmetro do atributo \"dataNasc\"\n\n        // Calcula a idade do aluno com base no ano atual e no ano de nascimento do aluno\n        idade = DateTime.Now.Year - dataNasc.Year;\n\n        // Ajusta a idade caso a data de aniversário do aluno ainda não chegou no ano corrente\n        if (DateTime.Now.DayOfYear \u003c dataNasc.DayOfYear)\n        {\n            idade--; // \u003c-- Reduz 1 ano se o aluno ainda não fez aniversário este ano\n        }\n    }\n\n    // Método para exibir informações do aluno\n    public void ExibirInformacoes()\n    {\n        Console.WriteLine($\"Nome: {nome}\"); // \u003c-- Exibe o nome do aluno\n        Console.WriteLine($\"Data de Nascimento: {dataNasc.ToShortDateString()}\"); // \u003c-- Exibe a data de nascimento do aluno formatada como string\n        Console.WriteLine($\"Idade: {idade}\"); // \u003c-- Exibe a idade do aluno\n    }\n}\n\ninternal class Program\n{\n    static void Main(string[] args)\n    {\n        // Solicita ao usuário o nome do aluno\n        Console.Write(\"Digite o nome do aluno: \");\n        string nome = Console.ReadLine();\n\n        // Solicita ao usuário a data de nascimento do aluno\n        Console.Write(\"Digite a data de nascimento do aluno (dd/MM/yyyy): \");\n        DateTime dataNasc;\n\n        // Tenta converter a entrada do usuário para DateTime até que uma data válida seja fornecida\n        while (!DateTime.TryParse(Console.ReadLine(), out dataNasc))\n        {\n            Console.Write(\"Data inválida. Digite a data de nascimento do aluno (dd/MM/yyyy): \");\n        }\n\n        // Criação de um objeto da classe \"Aluno\"\n        Aluno a1 = new Aluno(nome, dataNasc);\n\n        // Chama o método para exibir as informações do aluno\n        a1.ExibirInformacoes();\n\n        Console.ReadKey();\n    }\n}\n```\nVamos destacar quais conceitos foram aprendidos e como eles foram aplicados no código:\n\n### 1. **Classes**\n- **Definição**: Uma classe é um molde para criar objetos. Define atributos e métodos que os objetos dessa classe terão.\n- **Exemplo no código**: `public class Aluno` define uma classe chamada `Aluno`.\n\n### 2. **Objetos**\n- **Definição**: Um objeto é uma instância de uma classe.\n- **Exemplo no código**: `Aluno a1 = new Aluno(nome, dataNasc);` cria uma instância da classe `Aluno`.\n\n### 3. **Atributos**\n- **Definição**: Variáveis dentro de uma classe que armazenam dados.\n- **Exemplo no código**: `public string nome;`, `public DateTime dataNasc;` e `public int idade;` são atributos da classe `Aluno`.\n\n### 4. **Métodos**\n- **Definição**: Funções dentro de uma classe que definem comportamentos dos objetos.\n- **Exemplo no código**: `public void ExibirInformacoes()` é um método na classe `Aluno`.\n\n### 5. **Métodos Construtores**\n- **Definição**: Métodos especiais que são chamados quando um objeto é criado. Inicializam atributos.\n- **Exemplo no código**: `public Aluno(string nome, DateTime dataNasc)` é o construtor da classe `Aluno`.\n\n### 6. **Encapsulamento (Get e Set)**\n- **Definição**: Protege os dados de uma classe e permite acesso controlado. No exemplo dado, não há uso explícito de propriedades com `get` e `set`, mas a lógica de encapsulamento foi seguida com os atributos e métodos.\n- **Exemplo no código**: `public string nome;`, `public DateTime dataNasc;` e `public int idade;` são acessados e modificados diretamente. Em um design mais robusto, você poderia usar propriedades para encapsular esses campos.\n\n\u003cdiv align=\"left\"\u003e\n  \u003ch6\u003e\u003ca href=\"#programação-orientada-a-objetos-\"\u003e Voltar para o início ↺\u003c/a\u003e\u003c/h6\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg width=100% align=\"center\" src=\"https://capsule-render.vercel.app/api?type=rect\u0026color=8354d2\u0026height=4\u0026section=header\u0026%20render\"\u003e\n\u003c/div\u003e\n\n### 4. Revisão de P.O.O 2\n\n\u003e [!NOTE]\\\n\u003e *Retirado da aula de \"[RevisaoPOO2](https://github.com/juletopi/POO_Programacao_Orientada_a_Objetos/tree/main/RevisaoPOO2)\"*\n\n\u003cdiv align=\"left\"\u003e\n\n  - Nesta aula foram revisionados \"Listas\":\n    - Criação de listas\n    - Manipulação de listas\n    - Exibição dos resultados destas listas\n \n\u003c/div\u003e\n  \n```c#\npublic class Alunos // \u003c-- Classe Alunos\n{\n    // Atributos da classe Alunos\n    public string nome;\n    public int matricula;\n    public string cpf;\n    public string email;\n    public DateTime dataNasc;\n\n    // Método construtor da classe Alunos\n    public Alunos (string alunoNome, int alunoMatricula, string alunoCPF, string alunoEmail, DateTime alunoDataNasc)\n    {\n        nome = alunoNome;\n        matricula = alunoMatricula;\n        cpf = alunoCPF;\n        email = alunoEmail;\n        dataNasc = alunoDataNasc;\n    }\n\n    // Sobrescrevendo o método ToString para fornecer uma representação em string dos dados do aluno\n    public override string ToString()\n    {\n        return \"Nome: \" + nome + \" - \" + \"Matrícula: \" + matricula + \" - \" + \"CPF: \" + cpf + \" - \" + \"E-mail: \" + email + \" - \" + \"Data de Nascimento: \" + dataNasc.ToString();\n    }\n}\n\ninternal class Program\n{\n    static void Main(string[] args)\n    {\n        // Criação de uma lista de objetos da classe Alunos\n        List\u003cAlunos\u003e listAlunos = new List\u003cAlunos\u003e();\n\n        // Criação de objetos da classe Alunos\n        Alunos aluno1 = new Alunos(\"Rafaela\", 048, \"625552980-20\", \"rafa022@gmail.com\", new DateTime(2001, 09, 12));\n        Alunos aluno2 = new Alunos(\"Júlio\", 027, \"073743612-38\", \"julio03@gmail.com\", new DateTime(2003, 09, 17));\n        Alunos aluno3 = new Alunos(\"Breno\", 089, \"390900176-46\", \"brenopd@gmail.com\", new DateTime(2005, 09, 01));\n        Alunos aluno4 = new Alunos(\"Iberê\", 021, \"192236608-36\", \"tenoriomm@gmail.com\", new DateTime(1998, 11, 21));\n        Alunos aluno5 = new Alunos(\"João\", 055, \"902630047-18\", \"jaovictor001@gmail.com\", new DateTime(1991, 07, 03));\n\n        // Adicionando os objetos Alunos à lista\n        listAlunos.Add(aluno1);\n        listAlunos.Add(aluno2);\n        listAlunos.Add(aluno3);\n        listAlunos.Add(aluno4);\n        listAlunos.Add(aluno5);\n\n        // Exibindo todos os alunos da lista\n        Console.WriteLine(\"Exibindo a lista de alunos:\\r\\n\");\n        foreach (Alunos alunos in listAlunos)\n        {\n            Console.WriteLine(alunos.ToString());\n        }\n        Console.WriteLine(\"\\r\\n---------------------------------------------\\r\\n\");\n\n        // Buscando e exibindo um aluno específico pela matrícula\n        Console.WriteLine(\"Exibindo a busca por um aluno específico:\\r\\n\");\n        Alunos search = listAlunos.Find(x =\u003e x.matricula == 027);\n        Console.WriteLine(search.ToString());\n        Console.WriteLine(\"\\r\\n---------------------------------------------\\r\\n\");\n\n        // Buscando e exibindo alunos com número de matrícula maior que 40\n        Console.WriteLine(\"Exibindo a lista de alunos com o número de matrícula maior que 40:\\r\\n\");\n        List\u003cAlunos\u003e searchList = listAlunos.Where(x =\u003e x.matricula \u003e 40).ToList();\n        foreach (Alunos alunos in searchList)\n        {\n            Console.WriteLine(alunos.ToString());\n        }\n        Console.WriteLine(\"\\r\\n---------------------------------------------\\r\\n\");\n\n        // Buscando e exibindo o maior número de matrícula\n        Console.WriteLine(\"Exibindo o maior número de matrícula:\\r\\n\");\n        int b = listAlunos.Max(x =\u003e x.matricula);\n        Console.WriteLine(b);\n        Console.WriteLine(\"\\r\\n---------------------------------------------\\r\\n\");\n\n        // Ordenando e exibindo a lista de alunos pelo número de matrícula em ordem crescente\n        Console.WriteLine(\"Exibindo a lista de alunos ordenados a partir do número de matrícula em ordem crescente:\\r\\n\");\n        List\u003cAlunos\u003e ordenedList = listAlunos.OrderBy(x =\u003e x.matricula).ToList();\n        foreach (Alunos alunos in ordenedList)\n        {\n            Console.WriteLine(alunos.ToString());\n        }\n        Console.WriteLine(\"\\r\\n---------------------------------------------\\r\\n\");\n\n        // Buscando e exibindo alunos cujos nomes contêm a letra 'e'\n        Console.WriteLine(\"Exibindo a busca por alunos com a letra 'e' em seus nomes:\\r\\n\");\n        List\u003cAlunos\u003e distinctiveList = listAlunos.Where(x =\u003e x.nome.ToLower().Contains(\"e\")).ToList();\n        foreach (Alunos alunos in distinctiveList)\n        {\n            Console.WriteLine(alunos.ToString());\n        }\n        Console.WriteLine(\"\\r\\n---------------------------------------------\\r\\n\");\n\n        // Buscando e exibindo alunos cujos nomes começam com a letra 'j'\n        Console.WriteLine(\"Exibindo a busca por alunos com nomes que começam com a letra 'j':\\r\\n\");\n        List\u003cAlunos\u003e startsWithList = listAlunos.Where(x =\u003e x.nome.ToLower().StartsWith(\"j\")).ToList();\n        foreach (Alunos alunos in startsWithList)\n        {\n            Console.WriteLine(alunos.ToString());\n        }\n\n        Console.ReadKey();\n    }\n}\n```\nVamos destacar quais conceitos foram aprendidos e como eles foram aplicados no código:\n\n### 1. **Listas**\n- **Definição**: Listas são coleções genéricas que podem armazenar elementos de um tipo específico e fornecer métodos para manipulação de dados.\n- **Exemplo no código**: `List\u003cAlunos\u003e listAlunos` cria uma lista para armazenar objetos da classe `Alunos`. Métodos como `Add`, `Find`, `Where`, `OrderBy`, `Max`, e `ToList` são usados para manipular a lista, como adicionar elementos, buscar, filtrar, ordenar e encontrar o valor máximo.\n\n### 2. **LINQ (Language Integrated Query)**\n- **Definição**: LINQ é uma tecnologia para realizar consultas a coleções de dados de maneira declarativa, integrando capacidades de consulta diretamente na linguagem C#.\n- **Exemplo no código**: Exemplos incluem:\n  - `Find(x =\u003e x.matricula == 027)` para encontrar um aluno específico pela matrícula.\n  - `Where(x =\u003e x.matricula \u003e 40).ToList()` para filtrar alunos com número de matrícula maior que 40.\n  - `OrderBy(x =\u003e x.matricula).ToList()` para ordenar os alunos pelo número de matrícula.\n  - `Max(x =\u003e x.matricula)` para encontrar o maior número de matrícula.\n  - `Where(x =\u003e x.nome.ToLower().Contains(\"e\")).ToList()` para encontrar alunos com a letra 'e' nos nomes.\n  - `Where(x =\u003e x.nome.ToLower().StartsWith(\"j\")).ToList()` para encontrar alunos cujos nomes começam com a letra 'j'.\n\n### 3. **Entrada e Saída de Dados**\n- **Definição**: Entrada e saída de dados referem-se à interação do programa com o usuário ou outras fontes de dados, permitindo que o programa receba informações e exiba resultados.\n- **Exemplo no código**: \n  - `Console.WriteLine` é usado para exibir mensagens e resultados das operações realizadas na lista.\n  - `Console.ReadKey` é usado para pausar a execução do programa até que uma tecla seja pressionada, permitindo ao usuário ver os resultados antes que o programa feche.\n\n\u003cdiv align=\"left\"\u003e\n  \u003ch6\u003e\u003ca href=\"#programação-orientada-a-objetos-\"\u003e Voltar para o início ↺\u003c/a\u003e\u003c/h6\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg width=100% align=\"center\" src=\"https://capsule-render.vercel.app/api?type=rect\u0026color=8354d2\u0026height=4\u0026section=header\u0026%20render\"\u003e\n\u003c/div\u003e\n\n### 5. Revisão de P.O.O 3\n\n\u003e [!NOTE]\\\n\u003e *Retirado da aula de \"[RevisaoPOO3](https://github.com/juletopi/POO_Programacao_Orientada_a_Objetos/tree/main/RevisaoPOO3)\"*\n\n\u003cdiv align=\"left\"\u003e\n\n  - Nesta aula foram revisionados \"Heranças\":\n    - Criação de heranças (Classes \"pai\" e classes \"filho\")\n    - Polimorfismo\n    - Métodos Virtuais e Override\n \n\u003c/div\u003e\n  \n```c#\npublic class Cliente // \u003c-- Classe Base \"pai\" Cliente\n{\n    // Propriedades comuns a todos os clientes\n    public string ID { get; set; }\n    public string Nome { get; set; }\n    public string Email { get; set; }\n    public string Telefone { get; set; }\n\n    // Método virtual que pode ser sobrescrito nas classes derivadas para cadastrar as informações do cliente\n    public virtual void Cadastrar()\n    {\n        // Este método será implementado nas classes derivadas...\n    }\n\n    // Método virtual que pode ser sobrescrito para exibir informações do cliente\n    public virtual void ExibirInformacoes()\n    {\n        Console.WriteLine($\"ID: {ID} - Nome: {Nome} - Email: {Email} - Telefone: {Telefone}\");\n    }\n}\n\npublic class ClientePJ : Cliente // \u003c-- Classe Derivada \"filho\" ClientePJ\n{\n    // Propriedades específicas para clientes pessoa jurídica (PJ)\n    public string CNPJ { get; set; }\n    public string RazaoSocial { get; set; }\n    public string NomeFantasia { get; set; }\n\n    // Implementação do método para cadastrar informações do cliente PJ\n    public override void Cadastrar()\n    {\n        Console.Write(\"Digite o ID: \");\n        ID = Console.ReadLine();\n\n        Console.Write(\"Digite o Nome: \");\n        Nome = Console.ReadLine();\n\n        Console.Write(\"Digite o Email: \");\n        Email = Console.ReadLine();\n\n        Console.Write(\"Digite o Telefone: \");\n        Telefone = Console.ReadLine();\n\n        Console.Write(\"Digite o CNPJ: \");\n        CNPJ = Console.ReadLine();\n\n        Console.Write(\"Digite a Razão Social: \");\n        RazaoSocial = Console.ReadLine();\n\n        Console.Write(\"Digite o Nome Fantasia: \");\n        NomeFantasia = Console.ReadLine();\n    }\n\n    // Método para exibir informações do cliente PJ\n    public override void ExibirInformacoes()\n    {\n        base.ExibirInformacoes(); // \u003c-- Chamando o método da classe base para exibir informações comuns\n        Console.WriteLine($\"CNPJ: {CNPJ} - Razão Social: {RazaoSocial} - Nome Fantasia: {NomeFantasia}\");\n    }\n}\n\npublic class ClientePF : Cliente // \u003c-- Classe Derivada \"filho\" ClientePF\n{\n    // Propriedades específicas para clientes pessoa física (PF)\n    public string CPF { get; set; }\n    public string FormacaoAcademica { get; set; }\n\n    // Implementação do método para cadastrar informações do cliente PF\n    public override void Cadastrar()\n    {\n        Console.Write(\"Digite o ID: \");\n        ID = Console.ReadLine();\n\n        Console.Write(\"Digite o Nome: \");\n        Nome = Console.ReadLine();\n\n        Console.Write(\"Digite o Email: \");\n        Email = Console.ReadLine();\n\n        Console.Write(\"Digite o Telefone: \");\n        Telefone = Console.ReadLine();\n\n        Console.Write(\"Digite o CPF: \");\n        CPF = Console.ReadLine();\n\n        Console.Write(\"Digite a Formação Acadêmica: \");\n        FormacaoAcademica = Console.ReadLine();\n    }\n\n    // Método para exibir informações do cliente PF\n    public override void ExibirInformacoes()\n    {\n        base.ExibirInformacoes(); // \u003c-- Chamando o método da classe base para exibir informações comuns\n        Console.WriteLine($\"CPF: {CPF} - Formação Acadêmica: {FormacaoAcademica}\");\n    }\n}\n```\nVamos destacar quais conceitos foram aprendidos e como eles foram aplicados no código:\n\n### 1. **Herança**\n- **Definição**: Herança é um princípio da P.O.O. que permite que uma classe derivada (filho) herde atributos e métodos de outra classe base (pai), promovendo a reutilização de código.\n- **Exemplo no código**: `public class ClientePJ : Cliente` e `public class ClientePF : Cliente`. Aqui, `ClientePJ` e `ClientePF` herdam propriedades e métodos da classe `Cliente`, como `ID`, `Nome`, `Email`, e `Telefone`.\n\n### 2. **Polimorfismo**\n- **Definição**: Polimorfismo permite que métodos em classes derivadas tenham diferentes implementações com a mesma assinatura de método na classe base, permitindo que o mesmo método se comporte de maneira diferente.\n- **Exemplo no código**: O método `Cadastrar` e `ExibirInformacoes` são sobrescritos (`override`) em `ClientePJ` e `ClientePF` para fornecer funcionalidades específicas para cada tipo de cliente. Por exemplo, `Cadastrar` em `ClientePJ` inclui a solicitação de `CNPJ`, enquanto em `ClientePF` inclui `CPF`.\n\n### 3. **Métodos Virtuais e Override**\n- **Definição**: Métodos virtuais são métodos na classe base que podem ser sobrescritos nas classes derivadas usando a palavra-chave `override`, permitindo que a classe derivada forneça uma implementação específica.\n- **Exemplo no código**: `public virtual void Cadastrar()` na classe `Cliente` é um método virtual que é sobrescrito (`override`) nas classes `ClientePJ` e `ClientePF` com suas próprias implementações específicas.\n\n\u003cdiv align=\"left\"\u003e\n  \u003ch6\u003e\u003ca href=\"#programação-orientada-a-objetos-\"\u003e Voltar para o início ↺\u003c/a\u003e\u003c/h6\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg width=100% align=\"center\" src=\"https://capsule-render.vercel.app/api?type=rect\u0026color=8354d2\u0026height=4\u0026section=header\u0026%20render\"\u003e\n\u003c/div\u003e\n\n### 6. Revisão de P.O.O 4\n\n\u003e [!NOTE]\\\n\u003e *Retirado da aula de \"[RevisaoPOO4](https://github.com/juletopi/POO_Programacao_Orientada_a_Objetos/tree/main/RevisaoPOO4)\"*\n\n\u003cdiv align=\"left\"\u003e\n\n  - Nesta aula foram revisionados \"Exceções\":\n    - Conceito de exceções\n    - Uso de exceções para casos de erro por interação do usuário\n \n\u003c/div\u003e\n  \n```c#\ninternal class Program\n{\n    static void Main(string[] args)\n    {\n        bool continuar = true;\n\n        while (continuar)\n        {\n            try // \u003c-- Início do bloco 'try-catch' para capturar 'Exceções'\n            {\n                Console.Write(\"Digite o primeiro número: \");\n                int num1 = Convert.ToInt32(Console.ReadLine());\n\n                Console.Write(\"Digite o segundo número: \");\n                int num2 = Convert.ToInt32(Console.ReadLine());\n\n                int resultado = num1 / num2;\n\n                Console.WriteLine($\"\\r\\nResultado: {resultado}\");\n            }\n            catch (DivideByZeroException) // \u003c-- Exceção lançada quando ocorre uma tentativa de divisão por zero.\n            {\n                Console.WriteLine(\"\\r\\nErro: Divisão por zero não é permitida!\");\n            }\n            catch (FormatException) // Exceção lançada quando a conversão de um tipo de dado para outro falha.\n            {\n                Console.WriteLine(\"\\r\\nErro: Entrada inválida. Por favor, insira um número inteiro!\");\n            }\n\n            Console.Write(\"\\r\\nDeseja realizar outra operação? (s/n): \");\n            string resposta = Console.ReadLine().ToLower();\n            Console.WriteLine(\"\\r\\n---------------------------------------------\\r\\n\");\n\n            if (resposta != \"s\")\n            {\n                continuar = false;\n            }\n        }\n        Console.WriteLine(\"Finalizando a aplicação...\");\n\n        Console.ReadKey();\n    }\n}\n```\nVamos destacar quais conceitos foram aprendidos e como eles foram aplicados no código:\n\n### 1. **Exceções**\n- **Definição**: Exceções são eventos que ocorrem durante a execução de um programa e que interrompem o fluxo normal de instruções, se não forem tratadas. Elas são usadas para indicar e tratar erros.\n- **Exemplo no código**: No bloco `try-catch`, foram capturadas exceções específicas, como `DivideByZeroException` e `FormatException`, para lidar com erros de divisão por zero e de formato de entrada inválido, respectivamente.\n\n### 2. **DivideByZeroException**\n- **Definição**: Uma exceção lançada quando ocorre uma tentativa de dividir um número por zero.\n- **Exemplo no código**: `catch (DivideByZeroException)`. Isso captura a exceção e exibe uma mensagem de erro informando que a divisão por zero não é permitida.\n\n### 3. **FormatException**\n- **Definição**: Uma exceção lançada quando uma tentativa de conversão de um tipo de dado para outro falha.\n- **Exemplo no código**: `catch (FormatException)`. Isso captura a exceção e exibe uma mensagem de erro informando que a entrada foi inválida e solicitando que seja inserido um número inteiro.\n\n\u003cdiv align=\"left\"\u003e\n  \u003ch6\u003e\u003ca href=\"#programação-orientada-a-objetos-\"\u003e Voltar para o início ↺\u003c/a\u003e\u003c/h6\u003e\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \n| \u003ch3 align=\"center\"\u003e➕ EXTRA \u003c/h3\u003e |\n|:---------------------------------|\n| \u003cp\u003e\u003cdiv align=\"center\"\u003eA partir deste ponto, é apresentado um \"conteúdo extra\".\u003cbr\u003e\u003cbr\u003e Este material adicional complementa o aprendizado de P.O.O juntamente\u003cbr\u003e com práticas sobre Banco de Dados, fazendo uma conexão com MySQL. \u003c/p\u003e |\n\n\u003c/div\u003e\n\u003cbr\u003e\n\n### 7. Conexão com MySQL em P.O.O\n\n\u003e [!NOTE]\\\n\u003e *Retirado da aula de \"[Conexao_com_SQL_(POO)](https://github.com/juletopi/POO_Programacao_Orientada_a_Objetos/tree/main/Conexao_com_SQL_(POO))\"* \\\n\u003e *Link do conteúdo sobre Conexão com MySQL em PDF: [Conexao_com_MySql.pdf](https://drive.google.com/file/d/1aLVD5gR8ZK7RJbayshn9ENLBc25Z1Spt/view?usp=sharing)*\n\n\u003cdiv align=\"left\"\u003e\n\n- Nesta aula foram aprendidos:\n  - Instalação do Pacote NuGet\n  - Uso do MySQL Workbench\n  - Criação do Banco de Dados para um Gerenciamento de Alunos\n  - Conexão e Manipulação de Dados com MySQL em CSharp\n\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"#\"\u003e\n    \u003cimg width=100% align=\"center\" src=\"https://capsule-render.vercel.app/api?type=rect\u0026color=151923\u0026height=2\u0026section=header\u0026%20render\"\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\n### **Instalação do Pacote NuGet**\n\nPara conectar um projeto em C# ao MySQL, é necessário instalar o pacote `MySql.Data` via **NuGet**, que contém as bibliotecas necessárias para a comunicação entre a aplicação C# e o banco de dados MySQL.\n\n#### **Passos para instalar o pacote MySql.Data no Visual Studio**\n\n1. **Abrir o Gerenciador de Soluções**:\n   - No menu superior do Visual Studio, clique em `Exibir \u003e Gerenciador de Soluções`.\n\n2. **Acessar os Pacotes NuGet**:\n   - Clique com o botão direito sobre o nome do seu projeto e selecione `Gerenciar Pacotes do NuGet`.\n\n3. **Buscar o Pacote MySql.Data**:\n   - Na aba `Procurar`, digite `MySql.Data` na barra de busca.\n\n4. **Selecionar e Instalar o Pacote**:\n   - Escolha a versão desejada do pacote e clique em `Instalar`.\n\n5. **Finalizar a Instalação**:\n   - O pacote será adicionado ao projeto, permitindo o uso das classes e métodos necessários para a conexão com MySQL.\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"#\"\u003e\n    \u003cimg width=100% align=\"center\" src=\"https://capsule-render.vercel.app/api?type=rect\u0026color=151923\u0026height=2\u0026section=header\u0026%20render\"\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\n### **Uso do MySQL Workbench**\n\nO MySQL Workbench é uma ferramenta gráfica de modelação, gerenciamento e administração de bancos de dados MySQL. Além de criar e modificar esquemas de banco de dados, ele também permite executar consultas SQL e visualizar resultados de maneira interativa. E é com esta ferramenta que criaremos o nosso banco de dados.\n\n#### **Passos para instalar o MySQL Workbench**\n\n1. **Baixar o MySQL Workbench**:\n   - Acesse a página oficial de downloads do MySQL: [Download MySQL Workbench](https://dev.mysql.com/downloads/workbench/).\n   - Selecione a versão adequada para o seu sistema operacional (Windows, macOS, Linux).\n\n2. **Instalar o MySQL Workbench**:\n   - Execute o arquivo baixado e siga as instruções do instalador.\n   - No Windows, é recomendado instalar o MySQL Workbench juntamente com o MySQL Installer, que facilita a instalação de outros componentes necessários.\n\n3. **Configuração Inicial**:\n   - Após a instalação, abra o MySQL Workbench.\n   - Configure a conexão com o servidor MySQL, utilizando as credenciais fornecidas durante a instalação do MySQL Server.\n\n\u003e [!TIP]\\\n\u003e Caso tenha dificuldade durante o processo, este [vídeo tutorial](https://www.youtube.com/watch?v=IEUgVwjXF0o) pode ajudar a configurar e conectar o MySQL Workbench pela primeira vez.\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"#\"\u003e\n    \u003cimg width=100% align=\"center\" src=\"https://capsule-render.vercel.app/api?type=rect\u0026color=151923\u0026height=2\u0026section=header\u0026%20render\"\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\n### **Criando um banco de dados com o MySQL Workbench**\n\nCom o MySQL Workbench instalado e configurado, podemos agora criar o nosso banco de dados.\n\n#### **Passos para criar um banco de dados no MySQL Workbench**:\n\n1. **Abrir o MySQL Workbench**.\n\n3. **Conectar-se ao servidor MySQL**:\n   - Use as credenciais configuradas (nome de usuário e senha) para acessar o servidor.\n\n4. **Criar um novo banco de dados**:\n   - Na barra de menus, vá para `Database` e selecione `Create New Database...`.\n   - Defina um nome para o banco de dados e clique em `Apply`.\n\n5. **Criar tabelas e definir colunas**:\n   - Na aba `Schemas`, clique com o botão direito no banco de dados recém-criado e selecione `Create Table...`.\n   - Adicione as colunas, defina os tipos de dados, e configure restrições.\n   - Clique em `Apply` para salvar as alterações.\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"#\"\u003e\n    \u003cimg width=100% align=\"center\" src=\"https://capsule-render.vercel.app/api?type=rect\u0026color=151923\u0026height=2\u0026section=header\u0026%20render\"\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\n### **Criando o banco de dados em SQL**\n\n```sql\n-- Criação do banco de dados\nCREATE DATABASE BancoDeDadosAlunos;\n\nUSE BancoDeDadosAlunos;\n\n-- Criação da tabela Alunos\nCREATE TABLE Alunos (\n    IdAluno INT PRIMARY KEY AUTO_INCREMENT,  -- Coluna para o ID único do Aluno\n    Nome VARCHAR(100),                       -- Coluna para o Nome do Aluno\n    CPF VARCHAR(11),                         -- Coluna para o CPF do Aluno\n    Email VARCHAR(100),                      -- Coluna para o Email do Aluno\n    Telefone VARCHAR(20),                    -- Coluna para o Telefone do Aluno\n    DataNascimento DATE                      -- Coluna para a Data de Nascimento do Aluno\n);\n\nSELECT * FROM Alunos;\n```\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"#\"\u003e\n    \u003cimg width=100% align=\"center\" src=\"https://capsule-render.vercel.app/api?type=rect\u0026color=151923\u0026height=2\u0026section=header\u0026%20render\"\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\n\n### **Criando o algoritmo de banco de dados em CSharp**\n\n```c#\nnamespace Conexao_com_SQL__POO_.Models\n{\n    internal class Aluno\n    {\n        public int IdAluno { get; set; }\n        public string Nome { get; set; }\n        public string CPF { get; set; }\n        public string Email { get; set; }\n        public string Telefone { get; set; }\n        public DateTime DataNascimento { get; set; }\n    }\n}\n\nusing MySql.Data.MySqlClient; // \u003c-- Importa a biblioteca necessária para trabalhar com MySQL\n\nnamespace Conexao_com_SQL__POO_\n{\n    public static class Conexao\n    {\n        static MySqlConnection conexao; // \u003c-- Objeto responsável por controlar a conexão com a base\n        public static MySqlConnection Conectar()\n        {\n            try\n            {\n                // Texto-string de conexão com o banco de dados\n                string connectionString = \"server=localhost;port=3306;uid=root;pwd=sua_senha_aqui;database=nome_do_seu_banco_de_dados_aqui\";\n                conexao = new MySqlConnection(connectionString);\n                conexao.Open();\n            }\n            catch (Exception ex)\n            {\n                Console.WriteLine(\"\\r\\nErro ao realizar a conexão com a base de dados!\");\n            }\n            return conexao;\n        }\n\n        // Método para fechar a conexão com o banco de dados\n        public static void FecharConexao()\n        {\n            conexao.Close();\n        }\n    }\n}\n\nusing MySql.Data.MySqlClient; // \u003c-- Importa a biblioteca necessária para trabalhar com MySQL\nusing System;\nusing System.Collections.Generic;\nusing Conexao_com_SQL__POO_.Models;\n\nnamespace Conexao_com_SQL__POO_.DAO\n{\n    internal class AlunoDAO\n    {\n        // Método para inserir um novo aluno no banco de dados\n        public void Insert(Aluno aluno)\n        {\n            try\n            {\n                // Converte a data de nascimento do aluno para o formato \"yyyy-MM-dd\"\n                string dataNascimento = aluno.DataNascimento.ToString(\"yyyy-MM-dd\");\n\n                // SQL para INSERIR um novo aluno na tabela \"alunos\"\n                string sql = \"INSERT INTO alunos(nome_alu, cpf_alu, email_alu, telefone_alu, data_nascimento_alu) \" +\n                             \"VALUES(@nome, @cpf, @email, @telefone, @dataNascimento)\";\n\n                MySqlCommand comando = new MySqlCommand(sql, Conexao.Conectar()); // \u003c-- Cria um comando MySQL para executar a instrução SQL\n\n                // Adiciona os parâmetros ao comando, substituindo os placeholders na SQL\n                comando.Parameters.AddWithValue(\"@nome\", aluno.Nome);\n                comando.Parameters.AddWithValue(\"@cpf\", aluno.CPF);\n                comando.Parameters.AddWithValue(\"@email\", aluno.Email);\n                comando.Parameters.AddWithValue(\"@telefone\", aluno.Telefone);\n                comando.Parameters.AddWithValue(\"@dataNascimento\", aluno.DataNascimento);\n                comando.ExecuteNonQuery(); // \u003c-- Executa o comando de inserção no banco de dados\n\n                Console.WriteLine(\"\\r\\nAluno cadastrado com sucesso!\");\n                Conexao.FecharConexao(); // \u003c-- Fecha a conexão com o banco de dados\n            }\n            catch (Exception ex)\n            {\n                throw new Exception($\"Erro ao cadastrar o aluno! {ex.Message}\");\n            }\n        }\n\n        // Método para deletar um aluno do banco de dados com base no ID\n        public void Delete(Aluno aluno)\n        {\n            try\n            {\n                // SQL para DELETAR um aluno da tabela \"alunos\" com base no ID\n                string sql = \"DELETE FROM alunos WHERE id_alu = @id_aluno\";\n                MySqlCommand comando = new MySqlCommand(sql, Conexao.Conectar());\n\n                comando.Parameters.AddWithValue(\"@id_aluno\", aluno.IdAluno);\n                comando.ExecuteNonQuery();\n\n                Console.WriteLine(\"\\r\\nAluno excluído com sucesso!\");\n                Conexao.FecharConexao();\n            }\n            catch (Exception ex)\n            {\n                throw new Exception($\"\\r\\nErro ao excluir o aluno! {ex.Message}\");\n            }\n        }\n\n        // Método para atualizar os dados de um aluno no banco de dados\n        public void Update(Aluno aluno)\n        {\n            try\n            {\n                // SQL para ATUALIZAR os dados do aluno na tabela \"alunos\"\n                string sql = \"UPDATE alunos SET nome_alu = @nome, cpf_alu = @cpf, email_alu = @email, \" +\n                             \"telefone_alu = @telefone WHERE id_alu = @id_aluno\";\n                MySqlCommand comando = new MySqlCommand(sql, Conexao.Conectar());\n\n                comando.Parameters.AddWithValue(\"@nome\", aluno.Nome);\n                comando.Parameters.AddWithValue(\"@cpf\", aluno.CPF);\n                comando.Parameters.AddWithValue(\"@email\", aluno.Email);\n                comando.Parameters.AddWithValue(\"@telefone\", aluno.Telefone);\n                comando.Parameters.AddWithValue(\"@id_aluno\", aluno.IdAluno);\n                comando.ExecuteNonQuery();\n\n                Console.WriteLine(\"\\r\\nAluno atualizado com sucesso!\");\n                Conexao.FecharConexao();\n            }\n            catch (Exception ex)\n            {\n                throw new Exception($\"\\r\\nErro ao atualizar o aluno! {ex.Message}\");\n            }\n        }\n\n        // Método para listar todos os alunos cadastrados no banco de dados\n        public List\u003cAluno\u003e List()\n        {\n            List\u003cAluno\u003e alunos = new List\u003cAluno\u003e(); // \u003c-- Cria uma lista para armazenar os alunos\n            try\n            {\n                // SQL para SELECIONAR todos os alunos da tabela \"alunos\", ordenados por nome\n                var sql = \"SELECT * FROM alunos ORDER BY nome_alu\";\n                MySqlCommand comando = new MySqlCommand(sql, Conexao.Conectar());\n\n                // Executa o comando e obtém os dados retornados pelo banco\n                using (MySqlDataReader dr = comando.ExecuteReader())\n                {\n                    while (dr.Read()) // \u003c-- Itera sobre os dados retornados e cria objetos Aluno para cada linha\n                    {\n                        Aluno aluno = new Aluno\n                        {\n                            IdAluno = dr.GetInt32(\"id_alu\"), // \u003c-- Atribui o ID do aluno\n                            Nome = dr.GetString(\"nome_alu\"), // \u003c-- Atribui o Nome do aluno\n                            Email = dr.GetString(\"email_alu\"), // \u003c-- Atribui o Email do aluno\n                            CPF = dr.GetString(\"cpf_alu\"), // \u003c-- Atribui o CPF do aluno\n                            Telefone = dr.GetString(\"telefone_alu\"), // \u003c-- Atribui o Telefone do aluno\n                            DataNascimento = dr.GetDateTime(\"data_nascimento_alu\") // \u003c-- Atribui a Data de Nascimento do aluno\n                        };\n                        alunos.Add(aluno);\n                    }\n                }\n                Conexao.FecharConexao();\n            }\n            catch (Exception ex)\n            {\n                throw new Exception($\"\\r\\nErro ao listar os alunos! {ex.Message}\");\n            }\n            return alunos;\n        }\n    }\n}\n```\n\nVamos destacar quais conceitos foram aprendidos e como eles foram aplicados no código:\n\n### 1. **Instalação do Pacote NuGet**\n- **Definição**: Permite adicionar bibliotecas externas ao projeto C# que são necessárias para funcionalidades específicas, como a conexão com o MySQL.\n- **Exemplo no código**: A instalação do pacote `MySql.Data` foi fundamental para usar as classes e métodos de conexão com o MySQL.\n\n### 2. **Criação da Classe `Conexao`**\n- **Definição**: A classe `Conexao` foi criada para gerenciar a conexão entre a aplicação e o banco de dados MySQL, facilitando a abertura e o fechamento de conexões de forma organizada e segura.\n- **Exemplo no código**: A classe `Conexao` encapsula a lógica de conexão com o banco de dados, utilizando o objeto `MySqlConnection` para abrir e fechar a conexão sempre que necessário, garantindo que a comunicação com o banco seja feita de forma eficiente e evitando problemas de conexão persistente.\n\n### 3. **Padrão DAO (Data Access Object)**\n- **Definição**: O Padrão DAO é um padrão de design que separa a lógica de acesso ao banco de dados das regras de negócio, organizando as operações de CRUD (Create, Read, Update, Delete) em classes específicas.\n- **Exemplo no código**: No projeto, foi implementada uma classe DAO para gerenciar as operações de inserção, deleção, atualização e listagem de usuários. Isso inclui métodos como `InserirUsuario()`, `DeletarUsuario()`, `AtualizarUsuario()` e `ListarUsuarios()`, que interagem diretamente com o banco de dados, mantendo o código limpo e modular.\n\n### 4. **Uso do MySQL Workbench**\n- **Definição**: O MySQL Workbench é uma ferramenta gráfica de modelagem, gerenciamento e administração de bancos de dados MySQL. Além de criar e modificar esquemas de banco de dados, ele também permite executar consultas SQL e visualizar resultados de maneira interativa.\n- **Exemplo no código**: Utilizamos o MySQL Workbench para criar o banco de dados `BancoDeDadosAlunos` e a tabela `Alunos`, que são fundamentais para o funcionamento do sistema de gerenciamento de usuários.\n\n### 5. **Conexão com MySQL**\n- **Definição**: Estabelecer uma conexão entre a aplicação C# e o banco de dados MySQL, permitindo a execução de comandos SQL e manipulação de dados.\n- **Exemplo no código**: O uso da classe `MySqlConnection` para conectar ao banco de dados e `MySqlCommand` para executar uma consulta SQL que lista todos os alunos cadastrados.\n\n### 6. **Manipulação de Dados com MySQL em C#**\n- **Definição**: A execução de comandos SQL diretamente a partir do código C#, permitindo que a aplicação interaja com o banco de dados para criar, ler, atualizar e deletar dados.\n- **Exemplo no código**: O método `ListarUsuarios()` no DAO executa o comando SQL `SELECT * FROM Usuarios` para recuperar todos os registros da tabela `Usuarios` e exibi-los na aplicação.\n\n\u003cdiv align=\"left\"\u003e\n  \u003ch6\u003e\u003ca href=\"#programação-orientada-a-objetos-\"\u003e Voltar para o início ↺\u003c/a\u003e\u003c/h6\u003e\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n\u003c!-- AUTHOR --\u003e\n\n## 👤 Autor\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd valign=\"top\" width=\"33%\"\u003e\n      \u003cdiv align=\"center\"\u003e  \n        \u003ca href=\"https://github.com/juletopi\"\u003e\n          \u003cimg src=\"https://user-images.githubusercontent.com/76459155/220271784-9f930c36-c370-4518-9b56-604627c6e2b5.png\" width=\"120px;\" alt=\"JuletopiAvatar-pic\" title=\"Autor: Juletopi\" /\u003e\n          \u003cbr\u003e\n          \u003csub\u003e\u003cb\u003eJúlio Cézar | Juletopi\u003c/b\u003e\u003c/sub\u003e\n        \u003c/a\u003e\n      \u003c/div\u003e\n    \u003c/td\u003e\n    \u003ctd valign=\"left\" width=\"100%\"\u003e\n      \u003cdiv align=\"left\"\u003e\n        \u003cul\u003e\n          \u003cli\u003e\n            \u003csub\u003e\u003cimg align=\"center\" src=\"https://cdn.jsdelivr.net/gh/devicons/devicon/icons/linkedin/linkedin-original.svg\" height=\"15\" alt=\"LinkedIn-icon\"\u003e LinkedIn - \u003ca href=\"https://www.linkedin.com/in/julio-cezar-pereira-camargo/\"\u003eJúlio Cézar P. Camargo\u003c/a\u003e\u003c/sub\u003e\n          \u003c/li\u003e\n          \u003cli\u003e\n            \u003csub\u003e\u003cimg align=\"center\" src=\"https://pngimg.com/uploads/email/email_PNG100738.png\" height=\"15\" alt=\"Facebook-icon\"\u003e Email - \u003ca href=\"mailto:juliocezarpvh@hotmail.com\"\u003ejuliocezarpvh@hotmail.com\u003c/a\u003e\u003c/sub\u003e\n          \u003c/li\u003e\n          \u003cli\u003e\n            \u003csub\u003e\u003cimg align=\"center\" src=\"https://cdn3.emoji.gg/emojis/6158-whatsapp.png\" height=\"15\" alt=\"WhatsApp-icon\"\u003e Whatsapp - \u003ca href=\"http://api.whatsapp.com/send?phone=5569993606894\"\u003e+55 (69) 9 9360-6894\u003c/a\u003e\u003c/sub\u003e\n          \u003c/li\u003e\n          \u003cli\u003e\n            \u003csub\u003e\u003cimg align=\"center\" src=\"https://cdn3.emoji.gg/emojis/6333-instagram.png\" height=\"15\" alt=\"Instagram-icon\"\u003e Instagram - \u003ca href=\"https://www.instagram.com/juletopi/\"\u003e@juletopi\u003c/a\u003e\u003c/sub\u003e\n          \u003c/li\u003e\n        \u003c/ul\u003e\n      \u003c/div\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003cdiv align=\"left\"\u003e\n  \u003ch6\u003e\u003ca href=\"#programação-orientada-a-objetos-\"\u003e Voltar para o início ↺\u003c/a\u003e\u003c/h6\u003e\n\u003c/div\u003e\n\n\u003cbr\u003e\n\n\u003c!-- THANK YOU, GOODBYE --\u003e\n\n----\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://git.io/typing-svg\"\u003e\n    \u003cimg src=\"https://readme-typing-svg.demolab.com?font=Sue+Ellen+Francisco\u0026size=40\u0026duration=1\u0026pause=99999\u0026color=8354d2\u0026center=true\u0026vCenter=true\u0026repeat=false\u0026width=620\u0026height=60\u0026lines=Obrigado+por+visitar%2C+e+até+a+próxima!\" alt=\"TypingGoodbye-SVG\" title=\"Boas venturas e volte sempre que precisar! ;)\"/\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n  Feito com 💜 por \u003ca href=\"https://github.com/juletopi\"\u003e Juletopi\u003c/a\u003e.\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjuletopi%2Fpoo_programacao_orientada_a_objetos","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjuletopi%2Fpoo_programacao_orientada_a_objetos","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjuletopi%2Fpoo_programacao_orientada_a_objetos/lists"}