Orientação a Objetos - Polimorfismo

Nesta aula iremos aprender um pouco mais sobre orientação a objetos, falando sobre polimorfismo, iremos alterar a nossa aplicação console refatorando o nosso código deixando mais simples.

assinaturaAssine nossa Comunidade

POO - Polimorfismo

Polimorfismo ocorre quando temos duas ou mais classes que herdam de uma super classe e possuem métodos de mesmo nome , ou seja , podemos sobrescrever estes métodos e terão comportamentos diferentes em cada classe.

Abaixo iremos refatorar o código da aula anterior, mantendo o método Gravar() na classe Cliente e possibilitar que esse metodo seja sobrescrito em outras classes que herdam de Cliente.

Para isso vamos utilizar a palavra virtual.

      
        namespace Classes
        {
          public class Cliente
          {
            
            public string Nome;
            public string Telefone;
            public string CPF;

            public Cliente(string nome, string telefone, string cpf)
            {
              this.Nome = nome;
              this.Telefone = telefone;
              this.CPF = cpf;
            }
           
            public Cliente(){}

            //para permitir que o método da classe pai seja sobrescrito na classe filha 
            //devemos incluir a palavra virtual na declaração do método.
            public virtual void Gravar()
            {

              var clientes = Cliente.LerClientes();
              clientes.Add(this);
              if (File.Exists(caminhoBase()))
              {
                StreamWriter r = new StreamWriter(caminhoBase());
                r.WriteLine("nome;telefone;cpf");
                foreach(Cliente c in clientes)
                {
                  var linha = c.Nome + ";" + c.Telefone + ";" + c.CPF + ";";
                  r.WriteLine(linha);
                }
                r.close;
              }
            }
          }
        }
      
    

Vamos criar uma nova classe chamada Usuario que vai herdar da classe de Cliente.

Dessa forma vamos sobrescrever o método Gravar(), permitindo que , e tempo de execução, ao chamar o método Gravar da instância de Usuario sejam gravados os dados do usuário

Para isso vamos utilizar a palavra override.

      
        namespace Classes
        {
          public class Usuario : Cliente
          {
         
            public Usuario(string nome, string telefone, string cpf)
            {
              this.Nome = nome;
              this.Telefone = telefone;
              this.CPF = cpf;
            }
           
            public Usuario(){}

            
            public override void Gravar()
            {
              var usuario = Usuario.LerUsuarios();
              usuario.Add(this);
              if (File.Exists(caminhoBase()))
              {
                StreamWriter r = new StreamWriter(caminhoBase());
                r.WriteLine("nome;telefone;cpf");
                foreach(Usuario u in usuario)
                {
                  var linha = u.Nome + ";" + u.Telefone + ";" + u.CPF + ";";
                  r.WriteLine(linha);
                }
                r.close;
              }
            }
          }
        }
      
    

Quando criamos a instância da classe Usuario no programa principal, chamamos o método Gravar() da classe Usuario.

      
            
        namespace console_app  
          class Program 
            {
              static void Main(string[] args)
              {
                Usuario u = new Usuario();
                u.Nome = "Maria";
                u.Telefone = "5298774";
                u.CPF = "78765547886";
                u.Gravar(); // Vai chamar o método Gravar() da classe Usuario.
              }
            }
    
       
    

No C# podemos também Não permitir que um método de classe seja sobrescrito.

Para isso utilizamos a palavra sealed na declaração do método.

      
        namespace Classes
        {
          public class Cliente
          {
            
            public string Nome;
            public string Telefone;
            public string CPF;

            public Cliente(string nome, string telefone, string cpf)
            {
              this.Nome = nome;
              this.Telefone = telefone;
              this.CPF = cpf;
            }
           
            public Cliente(){}

            //Não permite que o método Gravar() seja sobrescrito em outra classe
            public sealed void Gravar()
            {
              Console.WriteLine("Gravar dados de clientes");
            }
          }
        }
      
    

Podemos também chamar métodos original da classe pai.

Para isso utilizamos a palavra base e o nome do método.

No exemplo abaixo, vamos permitir que o método Olhar() da classe pai Cliente seja sobrescrito.

      
        namespace Classes
        {
          public class Cliente
          {

            public string Nome;
            public string Telefone;
            public string CPF;
            private string sobrenome = "Santos";

            public Cliente(string nome, string telefone, string cpf)
            {
              this.Nome = nome;
              this.Telefone = telefone;
              this.CPF = cpf;
            }
           
            public Cliente(){}
            
            public virtual void Olhar() // o virtual permite sobrescrever  o método.
            {
              Console.WriteLine("O cliente" + this.Nome + " " + this.sobrenome + " está olhando para mim");
            }
          }
        }
      
    

Na classe Usuario abaixo, sobrescrevemos o método Olhar() e chamamos a o método Olhar() da classe pai Cliente, utilizando a palavra base.

      
        namespace Classes
        {
          public class Usuario : Cliente
          {

            public Usuario(string nome, string telefone, string cpf)
            {
              this.Nome = nome;
              this.Telefone = telefone;
              this.CPF = cpf;
            }
           
            public Usuario(){}
            
            public override void Olhar()
            {
              Console.WriteLine("O Usuário" + this.Nome + "não tem o sobrenome pois é atributo private da classe pai,
              está olhando para mim");
              Console.WriteLine("===========================");
              Console.WriteLine("O método original é:");
              base.Olhar() //Aqui chamamos o método Olhar() da classe Cliente.
            }
          }
        }
      
    

Orientação a Objetos - Polimorfismo

Nesta aula iremos aprender um pouco mais sobre orientação a objetos, falando sobre polimorfismo, iremos alterar a nossa aplicação console refatorando o nosso código deixando mais simples.

Próximas Aulas:
assinaturaAssine nossa Comunidade

POO - Polimorfismo

Polimorfismo ocorre quando temos duas ou mais classes que herdam de uma super classe e possuem métodos de mesmo nome , ou seja , podemos sobrescrever estes métodos e terão comportamentos diferentes em cada classe.

Abaixo iremos refatorar o código da aula anterior, mantendo o método Gravar() na classe Cliente e possibilitar que esse metodo seja sobrescrito em outras classes que herdam de Cliente.

Para isso vamos utilizar a palavra virtual.

      
        namespace Classes
        {
          public class Cliente
          {
            
            public string Nome;
            public string Telefone;
            public string CPF;

            public Cliente(string nome, string telefone, string cpf)
            {
              this.Nome = nome;
              this.Telefone = telefone;
              this.CPF = cpf;
            }
           
            public Cliente(){}

            //para permitir que o método da classe pai seja sobrescrito na classe filha 
            //devemos incluir a palavra virtual na declaração do método.
            public virtual void Gravar()
            {

              var clientes = Cliente.LerClientes();
              clientes.Add(this);
              if (File.Exists(caminhoBase()))
              {
                StreamWriter r = new StreamWriter(caminhoBase());
                r.WriteLine("nome;telefone;cpf");
                foreach(Cliente c in clientes)
                {
                  var linha = c.Nome + ";" + c.Telefone + ";" + c.CPF + ";";
                  r.WriteLine(linha);
                }
                r.close;
              }
            }
          }
        }
      
    

Vamos criar uma nova classe chamada Usuario que vai herdar da classe de Cliente.

Dessa forma vamos sobrescrever o método Gravar(), permitindo que , e tempo de execução, ao chamar o método Gravar da instância de Usuario sejam gravados os dados do usuário

Para isso vamos utilizar a palavra override.

      
        namespace Classes
        {
          public class Usuario : Cliente
          {
         
            public Usuario(string nome, string telefone, string cpf)
            {
              this.Nome = nome;
              this.Telefone = telefone;
              this.CPF = cpf;
            }
           
            public Usuario(){}

            
            public override void Gravar()
            {
              var usuario = Usuario.LerUsuarios();
              usuario.Add(this);
              if (File.Exists(caminhoBase()))
              {
                StreamWriter r = new StreamWriter(caminhoBase());
                r.WriteLine("nome;telefone;cpf");
                foreach(Usuario u in usuario)
                {
                  var linha = u.Nome + ";" + u.Telefone + ";" + u.CPF + ";";
                  r.WriteLine(linha);
                }
                r.close;
              }
            }
          }
        }
      
    

Quando criamos a instância da classe Usuario no programa principal, chamamos o método Gravar() da classe Usuario.

      
            
        namespace console_app  
          class Program 
            {
              static void Main(string[] args)
              {
                Usuario u = new Usuario();
                u.Nome = "Maria";
                u.Telefone = "5298774";
                u.CPF = "78765547886";
                u.Gravar(); // Vai chamar o método Gravar() da classe Usuario.
              }
            }
    
       
    

No C# podemos também Não permitir que um método de classe seja sobrescrito.

Para isso utilizamos a palavra sealed na declaração do método.

      
        namespace Classes
        {
          public class Cliente
          {
            
            public string Nome;
            public string Telefone;
            public string CPF;

            public Cliente(string nome, string telefone, string cpf)
            {
              this.Nome = nome;
              this.Telefone = telefone;
              this.CPF = cpf;
            }
           
            public Cliente(){}

            //Não permite que o método Gravar() seja sobrescrito em outra classe
            public sealed void Gravar()
            {
              Console.WriteLine("Gravar dados de clientes");
            }
          }
        }
      
    

Podemos também chamar métodos original da classe pai.

Para isso utilizamos a palavra base e o nome do método.

No exemplo abaixo, vamos permitir que o método Olhar() da classe pai Cliente seja sobrescrito.

      
        namespace Classes
        {
          public class Cliente
          {

            public string Nome;
            public string Telefone;
            public string CPF;
            private string sobrenome = "Santos";

            public Cliente(string nome, string telefone, string cpf)
            {
              this.Nome = nome;
              this.Telefone = telefone;
              this.CPF = cpf;
            }
           
            public Cliente(){}
            
            public virtual void Olhar() // o virtual permite sobrescrever  o método.
            {
              Console.WriteLine("O cliente" + this.Nome + " " + this.sobrenome + " está olhando para mim");
            }
          }
        }
      
    

Na classe Usuario abaixo, sobrescrevemos o método Olhar() e chamamos a o método Olhar() da classe pai Cliente, utilizando a palavra base.

      
        namespace Classes
        {
          public class Usuario : Cliente
          {

            public Usuario(string nome, string telefone, string cpf)
            {
              this.Nome = nome;
              this.Telefone = telefone;
              this.CPF = cpf;
            }
           
            public Usuario(){}
            
            public override void Olhar()
            {
              Console.WriteLine("O Usuário" + this.Nome + "não tem o sobrenome pois é atributo private da classe pai,
              está olhando para mim");
              Console.WriteLine("===========================");
              Console.WriteLine("O método original é:");
              base.Olhar() //Aqui chamamos o método Olhar() da classe Cliente.
            }
          }
        }