Alura > Cursos de Programação > Cursos de .NET > Conteúdos de .NET > Primeiras aulas do curso C#: usando herança e implementando interfaces

C#: usando herança e implementando interfaces

Orientação a Objetos com C# - Apresentação

Olá, meu nome é André Bessa. Por questões de acessibilidade, vou me descrever. Sou um homem negro, barba por fazer, cabelo baixo e rosto arredondado. Serei seu instrutor em mais este curso de C# e orientação a objetos, voltado para pessoas que estão aprofundando o estudo deste modelo de programação usando a linguagem C#. Neste curso, nós vamos trabalhar com um projeto para salários e bonificações do ByteBank.

Estou com o projeto aberto no Visual Studio, a ferramenta que vamos trabalhar durante o curso. Vamos criar a classe Funcionario com as regras para bonificação e aumento de salário dos funcionários do ByteBank. Vamos desenvolver também a classe Diretor. Cada uma dessas classes com as suas próprias regras para aumentar salário e para bonificar os funcionários.

Durante o percurso, vamos estudar sobre herança de classe para reaproveitamento de código, classes abstratas e interfaces para que possamos ter um código mais flexível às necessidades de implementação que vão surgir durante o curso, além de estruturar o projeto para facilitar futuras manutenções.

Ao final deste curso, você conseguirá criar um programa usando orientação a objetos, herança e C#. Para aproveitar o conteúdo, recomendamos que você tenha os conceitos da linhagem C#, como tipos, variáveis, estruturas, e conceitos como classes e objetos. Se animou? Vamos começar?

Orientação a Objetos com C# - Organizando o projeto

Vamos dar continuidade ao nosso projeto, trabalhando com o ByteBank. Neste curso, vamos trabalhar com um lado mais administrativo do banco: gerenciar bonificação e salários dos colaboradores do ByteBank.

Já estou com o Visual Studio aberto, nossa IDE, para podermos criar o nosso projeto. Na parte inferior, à direita, clicaremos em "Criar um projeto". Serão mostrados s modelos mais recentes de projeto dentro do Visual Studio.

Vamos trabalhar com o "Aplicativo do Console". Vamos clicar nele e depois em "Próximo". Temos que dar um nome ao nosso projeto. Vamos imaginar esse projeto como mais um módulo dentro de um projeto maior do ByteBank. Temos projeto de contas correntes e clientes, agora temos um projeto mais administrativo. Vamos nomear "bytebank_ADM", só para diferenciar o tipo de projeto.

A localização do projeto também é importante, vamos inserir. O "Nome da solução", vamos manter "bytebank_ADM". Clicaremos em "Próximo". Aqui é importante definirmos a versão do framework que vamos trabalhar, vamos colocar a versão mais recente, ".Net 6.0", e clicar em "Criar" no final da página no canto inferior direito. O Visual Studio está compilando, criando o meu projeto, minha solução para trabalharmos com esses cargos e salários agora dentro do ByteBank.

Criamos um modelo padrão do aplicativo de console, Program.cs. Aqui no Program.cs, vou inserir as informações para exibir até ele compilar toda a nossa aplicação. Desde o princípio, eu quero trabalhar com o ByteBank. Vou apagar a primeira linha aqui, deixar só esse Console.WriteLine(), vou colocar Console.WriteLine("Boas Vindas, ao ByteBanck Administração"). Desde o início, eu quero trabalhar em uma estrutura mais organizada dos meus arquivos.

Olha só, nesse projeto clicando com o botão direito do mouse em cima do "bytebank_ADM > Adicionar > Nova Pasta". Essa pasta vai ser chamada "Funcionarios". Todas as classes referentes ao funcionário do ByteBank vamos colocar os arquivos aqui para deixar mais centralizado, para ficar mais fácil para futuras manutenções. Em cima do diretório que acabamos de criar, clicaremos com o botão direito do mouse, "Adicionar > Classe...", essa classe vai se chamar "Funcionario", vou clicar em "Adicionar".

A classe Funcionario é criada pelo Visual Studio com template, internal class Funcionario. Esse internal é colocado automaticamente para mim, pois é a visibilidade padrão de uma classe quando a criamos. Vou mudar para public class Funcionario. O Funcionario já mapeou algumas informações que são úteis para trabalharmos dentro do sistema do ByteBank. Por exemplo, o nome do funcionário, o CPF, o salário dele é importantíssimo, além de outras informações que eu poderia mapear aqui também.

Vamos começar. Na classe Funcionario, eu vou definir:

public class Funcionario
{
    public string nome;
    public string cpf;
    public double salario;
}

Criamos alguns campos da classe Funcionario. Como são públicos, posso acessá-los do meu arquivo Program.cs, a partir do momento que eu criar um objeto dele. É interessante que tenhamos alguns comportamentos também. Por exemplo, a classe Funcionario tem os campos, nome, cpf e salario. Vamos adicionar um comportamento também de bonificação.

Vamos criar um método que vai retornar o valor da bonificação com base no salário do funcionário da ByteBank. A regra, a princípio, é 10% do salário:

public class Funcionario
{
    public string nome;
    public string cpf;
    public double salario;

    public double getBonificacao()
    {
        return salario*0.1;
    }
}

Salvei. A princípio já estou trabalhando com campos e comportamentos. Na classe Program.cs, vou criar um novo funcionário, Funcionario joao = new Funcionario(). Está dando erro por quê, nessa linha 3? Porque não importei o namespace. O arquivo Program.cs não encontra a classe Funcionario.

Vou colocar o cursor do mouse em cima de Funcionario, destacado em vermelho. Usando a tecla de atalho "Ctrl + .", vamos clicar em "using bytebank_ADM.Funcionarios", importei a biblioteca.

Eu quero exibir agora o salário do João, mas primeiro eu tenho que colocar informações para ele:

joao.nome = "João";
joao.cpf = "12345698";
joao.salario = 2000;

João? Vou colocar Pedro:

Funcionario pedro = new Funcionario;
pedro.nome = "Pedro";
pedro.cpf = "12345698";
pedro.salario = 2000;

O salário do Pedro é de R$2000,00. Vou exibir. Vou usar uma tecla de atalho aqui no Visual Studio que é muito interessante para podermos escrever Console.WriteLine, que é aquela função que vai exibir no console alguma mensagem.

Digitamos cw e apertamos a tecla "Tab" duas vezes e a IDE já escreve Console.WriteLine(), uma facilidade gigante. Vou usar a concatenação, qualquer string mais a variável que eu quero exibir. Quando ele exibir na tela, vai concatenar toda essa informação nessa mensagem. Console.WriteLine("Bonificação:" + pedro.getBonificacao()). Espero que o resultado, a saída seja R$200,00 de bonificação, que é 10%.

Vou dar o "Play" no Visual Studio, na parte superior. "Play bytebank_ADM". Está compilando o projeto, criando o executável e renderizando o console. Só esperar um pouco. E está lá, "Bonificação: 200", está certo. Vamos voltar aqui a nossa classe Funcionario. Olha só, não é interessante acessarmos diretamente os campos de uma classe.

Vimos em outros momentos, em cursos anteriores, que é interessante trabalhar com propriedades. Existem alguns recursos relacionados a propriedades que temos disponível no Visual Studio e no .NET como um todo que vai facilitar essa escrita. Posso criar uma propriedade para encapsular esse campo. Vamos ver esse recurso disponível no Visual Studio.

Selecionamos public string nome e perceba que aparece uma lâmpada amarela no canto esquerdo da minha tela, na linha 11. Se eu clicar aqui, vão aparecer algumas opções: gerar construtor, Equals, e tem aqui "Encapsular campos "nome" (e usar propriedade)". Escreveu para mim a propriedade "nome", que manipula o campo nome. Ele está com a sintaxe um pouco diferente, mas é uma propriedade.

Vou criar uma propriedade para nome, outra para cpf e outra para salario. Vou ter mais três linhas adicionais nesse código para encapsular as informações. É uma boa prática. Olha só, ele até mudou a visibilidade aqui do campo. O campo ficou privado e a propriedade pública. Se for trabalhar com campos, a recomendação é: crie campos privados. É certo para propriedades públicas ou métodos públicos. Perfeito?

Vou apagar a propriedade public string Nome que acabamos de criar na linha 16, eu não quero trabalhar com ela, pois tem um recurso ainda mais fácil para podermos trabalhar com propriedades. Um outro recurso do Visual Studio também. Se digitarmos prop e apertarmos a tecla "Tab" duas vezes, ele vai criar uma propriedade para nós, aquelas propriedades autoimplementadas public int MyProperty { get; set; }.

Eu só vou alterar aqui agora. Já montamos o esqueleto da minha propriedade. public string Nome { get; set; }, aqui vou seguir a recomendação até do próprio Visual Studio, os nomes das propriedades iniciando com letra maiúscula, os campos com letra minúscula. Vou apagar o campo private string nome na linha 11. Criei a propriedade Nome. Vou fazer a mesma coisa para CPF e salário. prop, "Tab + Tab", public string Cpf, vou apagar o campo cpf.

Só deixar o meu código um pouco mais limpo. A mesma coisa para salário, prop "Tab + Tab", public double Salario. Já começou a dar erro agora no meu getBonificacao(). Por quê? Porque eu estou trabalhando com um campo que não existe mais, agora eu tenho uma propriedade. Vou mudar aqui, mudar aqui para return Salario*0.1.

O meu código continua funcionando e compilando normalmente. Deixa eu vou voltar no nosso código, aqui no Program.cs. Agora começou a dar alguns erros, porque o campo cpf não existe mais, é Pedro.Cpf e Pedro.Salario. Corrigimos. Vou dar um "Play" aqui na aplicação para verificarmos, validarmos que está funcionando. O Visual Studio abriu essa tela para mim.

Está lá, "Bonificação: 200". Vamos continuar evoluindo a nossa aplicação do ByteBank. Finalizamos aqui uma classe Funcionario, com alguns campos para essa classe, Cpf, Nome e Salario e o método getBonificacao, que vai calcular a bonificação de 10% do salário dos funcionários do ByteBank.

Na sequência, vamos criar novas classes, utilizar o operador this para entendermos como funciona e como ajudar no desenvolvimento das nossas aplicações e, na sequência, vamos continuar evoluindo a nossa aplicação.

Orientação a Objetos com C# - Usando o this

Agora já temos o nosso projeto definido e a nossa primeira classe, classe Funcionario, precisamos nos atentar no tipo de funcionário que vamos trabalhar, por quê? Porque nem todo funcionário vai receber 10% de bonificação do seu salário.

Por exemplo, chegou uma informação do nosso gerente de projetos que o diretor (um tipo de funcionário também do ByteBank) recebe 100% do seu salário como bonificação. Precisamos refletir isso no código também.

Para começar a atender essa nova funcionalidade, essa diferenciação de funcionários, nós vamos criar um novo campo para receber esse tipo. No início da classe, vou adicionar aqui o seguinte código:

// 0 – funcionário
// 1 – diretor
// 2 – designer
// N - ... 

Vou definir um campo private int _tipo;. É um campo privado inteiro, que 0 vai definir que é o funcionário comum, 1 vai ser um diretor, 2 designer, 3 analista e assim sucessivamente.

Agora quando chamar o comportamento de bonificação, eu preciso diferenciar qual o tipo de funcionário. No método, no comportamento de getBonificacao(), eu vou adicionar o seguinte:

if(tipo==1
{
    return Salario;
}
else
{
    return Salario * 0.10;
}

Só que agora é o seguinte: eu preciso definir no momento da criação do objeto qual o tipo dele, se é funcionário, se é um diretor, se é um designer. Perfeito?

Existe uma maneira de fazer isso, é utilizando os métodos construtores. Eles são evocados, são chamados no momento que eu faço um new objeto. Um método construtor tem que ter o mesmo nome da classe e é um método público. public Funcionario(int _tipo). Criei um método construtor recebendo o parâmetro _tipo, vou passar essa informação para dentro do campo tipo da minha classe:

public Funcionario(int _tipo)
{
    _tipo = _tipo;
}

Nota o seguinte: não está dando erro o meu código, mas está marcando para mim aqui um ponto de atenção. Eu estou passando para dentro da variável, _tipo, o valor de _tipo. Isso pode causar uma certa confusão. Existe uma maneira de resolver isso, de maneira até mais elegante, usando a palavra reservada this, this._tipo = _tipo. Usando a palavra reservada this, eu consigo diferenciar o que é método da minha classe (o campo tipo) do que é o parâmetro.

Salvei o código aqui. Fiz a diferenciação. O tipo vai ser informado agora no momento de criar o objeto. Voltando para minha classe Program.cs, note que na linha 4, no momento que eu crio o objeto Funcionario começou a dar erro, por quê? Preciso passar o tipo do objeto nesse momento. Vou passar o 1 como parâmetro. Funcionario pedro = new Funcionario(1); e o 1 informa que é o tipo diretor. A bonificação que vai ser exibida na tela tem que ser 100% do salário, que é de R$ 2000.

Na parte superior do Visual Studio Community, vou clicar em "Play bytebank_ADM". Agora eu continuo criando objeto Funcionario, só que agora com o parâmetro 1, eu informo que esse funcionário é um diretor. Se é diretor, ele recebe 100% da sua bonificação. Fizemos refatoração do nosso código.

Agora eu consigo definir o tipo de funcionário no momento da criação no meu programa. 1 vai ser diretor, o 0 vai ser funcionário, 2 é designer e assim vou colocando aqui os códigos referentes ao tipo de funcionário a ser trabalhado. Usamos também a palavra reservada this para poder diferenciar o que é informação do objeto da classe e o que é parâmetro. Na sequência, continuamos refatorando o código para diferenciar melhor os tipos de funcionários dentro do ByteBank.

Sobre o curso C#: usando herança e implementando interfaces

O curso C#: usando herança e implementando interfaces possui 140 minutos de vídeos, em um total de 55 atividades. Gostou? Conheça nossos outros cursos de .NET em Programação, ou leia nossos artigos de Programação.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda .NET acessando integralmente esse e outros cursos, comece hoje!

Plus

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$85
à vista R$1.020
Matricule-se

Pro

  • Acesso a TODOS os cursos da plataforma

    Mais de 1200 cursos completamente atualizados, com novos lançamentos todas as semanas, em Programação, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.

  • Alura Challenges

    Desafios temáticos para você turbinar seu portfólio. Você aprende na prática, com exercícios e projetos que simulam o dia a dia profissional.

  • Alura Cases

    Webséries exclusivas com discussões avançadas sobre arquitetura de sistemas com profissionais de grandes corporações e startups.

  • Certificado

    Emitimos certificados para atestar que você finalizou nossos cursos e formações.

  • Alura Língua (incluindo curso Inglês para Devs)

    Estude a língua inglesa com um curso 100% focado em tecnologia e expanda seus horizontes profissionais.

12X
R$120
à vista R$1.440
Matricule-se
Conheça os Planos para Empresas

Acesso completo
durante 1 ano

Estude 24h/dia
onde e quando quiser

Novos cursos
todas as semanas