Introdução à substituição em C #
Substituir em C # é a reimplementação de um método de classe base em uma classe derivada. Neste, o método da classe base é substituído na classe filho. O método da classe derivada tem o mesmo nome e assinatura que o método da classe base. A substituição é útil para alcançar o polimorfismo de tempo de execução.
Existem algumas palavras-chave usadas na substituição de método.
1. Virtual - Essa palavra-chave é usada com uma classe base, o que significa que o método de uma classe base pode ser substituído.
public virtual void Method()
(
// implementation
)
2. Substituir - Esta palavra-chave é usada com uma classe derivada, o que significa que a classe derivada substitui um método de uma classe base.
public override void Method()
(
// implementation
)
3. Base - Esta palavra-chave é usada em uma classe derivada para chamar o método da classe base.
public override void Method()
(
base.Method();
// implementation
)
Como substituir obras em c #?
Abaixo está um exemplo de como podemos implementar a substituição em C #.
class Parent
(
public virtual void Demo() // base class
(
Console.WriteLine(“This is parent”);
)
)
class Child: Parent
(
public override void Demo() // derived class
(
Console.WriteLine(“This is child”);
)
)
No exemplo acima, existem duas classes, uma é classe base ou classe pai e a outra é classe derivada ou, podemos dizer, classe filho. Um método de classe base é derivado na classe filho. Neste, o método em um pai é virtual, o que significa que pode ser substituído pela classe filho. Substituir em um filho significa que esse método é igual ao método da classe pai com a mesma assinatura de método.
Tipos de substituição em c #
Abaixo estão os exemplos que mostram a substituição de várias palavras-chave.
Exemplo 1 - Sem palavras-chave virtuais e de substituição
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Overriding
(
class Bird // base class
(
public void fly() // base class method
(
Console.WriteLine("Birds are flying");
)
)
class Peacock : Bird // derived class
(
public new void fly() // derived class method
(
Console.WriteLine("Peacock is flying");
)
)
class Program
(
// main method
static void Main(string() args)
(
Bird b = new Peacock();
b.fly();
Console.ReadLine();
)
)
)
No exemplo acima, nenhuma palavra-chave é usada nas duas bases e nos métodos derivados.
Também no método principal, a referência pai é usada para chamar o método filho. Portanto, neste caso, quando nenhuma palavra-chave é usada, o método pai é chamado em vez de um método filho. Então a saída será
Resultado :
Exemplo 2 (a) - com palavras-chave virtuais e de substituição
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Overriding
(
class Bird // base class
(
public virtual void fly() // base class method
(
Console.WriteLine("Birds are flying");
)
)
class Peacock : Bird // derived class
(
public override void fly() // derived class method
(
Console.WriteLine("Peacock is flying");
)
)
class Program
(
// main method
static void Main(string() args)
(
Bird b = new Peacock();
b.fly();
Console.ReadLine();
)
)
)
Neste exemplo, virtual é usado na classe base, o que significa que dá autoridade à classe filho para implementar o método de sua própria maneira. Em uma classe derivada, a substituição é usada, o que significa que o método filho é o método de substituição. Ambos os métodos são os mesmos com o mesmo nome e a mesma assinatura de método, mas a parte da implementação é diferente. Neste exemplo também, a referência pai é usada para chamar o método filho. Mas como pai é um método virtual, portanto o método filho é chamado primeiro, em vez do método pai. Então a saída será
Resultado :
Exemplo 2 (b) - Palavras-chave virtuais e de substituição
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Overriding
(
class Bird // base class
(
public virtual void fly() // base class method
(
Console.WriteLine("Birds are flying");
)
)
class Peacock : Bird // derived class
(
public override void fly() // derived class method
(
Console.WriteLine("Peacock is flying");
)
)
class Program
(
//main method
static void Main(string() args)
(
Peacock p = new Peacock();
p.fly();
Console.ReadLine();
)
)
)
Este exemplo é o mesmo que o exemplo anterior, mas esse método filho é usado para referência.
Resultado :
Exemplo 3 - Com palavra-chave base
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Overriding
(
class Bird // base class
(
public virtual void fly() // base class method
(
Console.WriteLine("Birds are flying");
)
)
class Peacock : Bird // derived class
(
public override void fly() // derived class method
(
base.fly(); // base is use to call parent method
Console.WriteLine("Peacock is flying");
)
)
class Program
(
static void Main(string() args)
(
Peacock p = new Peacock();
p.fly();
Console.ReadLine();
)
)
)
No exemplo acima, a base é usada em uma classe derivada para chamar o método da classe base. Portanto, neste método base é chamado primeiro e depois o método derivado.
Resultado :
Exemplo 4 - Classes abstratas com substituição
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Overriding
(
abstract class Calculate
(
public abstract int sum();
)
class Values : Calculate // derived class
(
int val1;
int val2;
public Values(int a = 0, int b = 0)
(
val1 = a;
val2 = b;
)
public override int sum()
(
Console.WriteLine("sum of two values");
return (val1 + val2);
)
)
class Program
(
static void Main(string() args)
(
Values v = new Values(10, 20);
int a = v.sum();
Console.WriteLine(a);
Console.ReadLine();
)
)
)
No exemplo acima, um método abstrato é usado. Uma classe abstrata é implementada pela classe derivada que contém um método abstrato.
Resultado :
Regras para Substituição de Método
- A assinatura do método de uma classe derivada deve ser a mesma que uma classe base.
- A substituição não é possível na mesma classe.
- Modificadores de acesso devem ser os mesmos para métodos virtuais e métodos de substituição.
- A palavra-chave virtual é usada no método da classe base e Override é usada no método da classe derivada.
- O método da classe base não deve ser estático.
Conclusão
A substituição é útil no polimorfismo de tempo de execução. Ele permite que a classe derivada implemente um método de classe base à sua maneira. Portanto, a implementação do método é diferente da classe derivada de sua classe base. O método substituído pode ser virtual, substituir ou abstrato.
Artigos recomendados
Este é um guia para Substituir em C #. Aqui discutimos como usar palavras-chave substitutas e diferentes para Substituir em C # junto com Exemplos. Você também pode consultar nossos outros artigos sugeridos -
- Tratamento de exceções em c #
- Matrizes em c #
- Substituição de método em C #
- Variáveis em c #
- Modificadores de acesso em PHP
- Polimorfismo em Java
- Classes abstratas em JavaScript
- Exemplos desta palavra-chave