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 -

  1. Tratamento de exceções em c #
  2. Matrizes em c #
  3. Substituição de método em C #
  4. Variáveis ​​em c #
  5. Modificadores de acesso em PHP
  6. Polimorfismo em Java
  7. Classes abstratas em JavaScript
  8. Exemplos desta palavra-chave