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.
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.
}
}
}
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.
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.
}
}
}