C#virtual

Resumo : neste tutorial, você aprenderá como usar o modificador virtual C# e como usá-lo para definir um método virtual.

Introdução ao modificador virtual C#

Na herança , uma classe (subclasse) herda de outra classe (classe base). Se um membro da subclasse tiver o mesmo nome da classe base, o membro da subclasse substitui (ou oculta) o membro da classe base.

Por exemplo:

class Person
{
    public string Name { get; set; }

    public string Introduce() => $"Hi, I'm {Name}.";
}

class Employee : Person
{
    public string JobTitle { get; set; }

    public new string Introduce() => $"Hi, I'm {Name}. I'm a {JobTitle}.";
}Linguagem de código:  C#  ( cs )

Neste exemplo, o Introduce()método da Employeeclasse oculta o Introduce()método da Personclasse. O newmodificador comunica explicitamente nossa intenção.

No entanto, se quiser que um membro da subclasse substitua o membro com o mesmo nome na classe base, você precisará:

  • Primeiro, use o virtualmodificador na declaração do membro da classe base
  • Segundo, use o overridemodificador na declaração do membro da subclasse.

Por exemplo:

class Person
{
    public string Name { get; set; }

    public virtual string Introduce() => $"Hi, I'm {Name}.";
}

class Employee : Person
{
    public string JobTitle { get; set; }

    public override string Introduce() => $"Hi, I'm {Name}. I'm a {JobTitle}.";
}Linguagem de código:  C#  ( cs )

Neste exemplo:

  • Use a virtualpalavra-chave para modificar a declaração do Introduce()método na Personclasse.
  • Use a overridepalavra-chave para modificar a declaração do Introduce()método na Employeeclasse.

Diferenças entre modificadores novos e de substituição

Vamos dar um exemplo para entender a diferença entre os modificadores new e override.

O método de substituição

O overridemodificador instrui o compilador C# a usar a última implementação definida de um método; mesmo se você chamar o método em uma referência da classe base. Por exemplo:

class Person
{
    public string Name { get; set; }

    public virtual string Introduce() => $"Hi, I'm {Name}.";
}

class Employee : Person
{
    public string JobTitle { get; set; }

    public override string Introduce() => $"Hi, I'm {Name}. I'm a {JobTitle}.";
}Linguagem de código:  C#  ( cs )
// Program.cs
var employee = new Employee()
{
    Name = "John Doe",
    JobTitle = "C# Developer"
};
Console.WriteLine(employee.Introduce());


Person person = employee;
Console.WriteLine(person.Introduce()); Linguagem de código:  C#  ( cs )

Saída:

Hi, I'm John Doe. I'm a C# Developer.
Hi, I'm John Doe. I'm a C# Developer.Linguagem de código:  texto simples  ( texto simples )

Neste exemplo, quando chamamos o método Introduce(), o compilador executa o método definido na classe Employee conforme o esperado.

E quando chamamos o método Introduce() em uma instância da classe Person, o compilador também executa o método Introduce() definido na classe Employee.

O novo método

O newmodificador instrui o compilador C# a usar o método definido na subclasse. Entretanto, se você chamar o método em uma instância da classe base, o compilador usará o método definido na classe base, e não aquele definido na subclasse. Por exemplo:

class Person
{
    public string Name { get; set; }

    public string Introduce() => $"Hi, I'm {Name}.";
}

class Employee : Person
{
    public string JobTitle { get; set; }

    public new string Introduce() => $"Hi, I'm {Name}. I'm a {JobTitle}.";
}Linguagem de código:  C#  ( cs )
// Program.cs
var employee = new Employee()
{
    Name = "John Doe",
    JobTitle = "C# Developer"
};
Console.WriteLine(employee.Introduce());


Person person = employee;
Console.WriteLine(person.Introduce()); Linguagem de código:  C#  ( cs )

Saída:

Hi, I'm John Doe. I'm a C# Developer.
Hi, I'm John Doe.Linguagem de código:  texto simples  ( texto simples )

Quando chamamos o Introduce()método em uma instância da Employeeclasse, o compilador executa o método definido na Employeeclasse. Esse comportamento é o mesmo do exemplo do método de substituição.

Porém, quando chamamos o Introduce()método em uma instância da Personclasse, o compilador executa o método definido na Personclasse. Esta é a diferença.

Chamando um método da classe base

Para chamar explicitamente um método de uma classe base de uma subclasse, você usa a basepalavra-chave.

Por exemplo, o seguinte ilustra como chamar o Introduce()método da Personclasse no Introduce()método da Employeeclasse:

class Person
{
    public string Name { get; set; }

    public virtual string Introduce() => $"Hi, I'm {Name}.";
}

class Employee : Person
{
    public string JobTitle { get; set; }

    public override string Introduce() => $"{base.Introduce()} I'm a {JobTitle}.";
}Linguagem de código:  C#  ( cs )

Neste exemplo, referenciamos o Introduce()método da Personclasse no método Introduce() da classe Employee usando a basepalavra-chave:

base.Introduce()Linguagem de código:  CSS  ( css )

Se não fizéssemos isso, teríamos um método recursivo porque o Introduce()método chamaria a si mesmo.

Resumo

  • Use o virtualmodificador C# para um membro na classe base se desejar substituí-lo no membro com o mesmo nome das subclasses.
  • Use a palavra-chave base para referenciar explicitamente o método em uma classe base de uma subclasse.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *