Herança e construtor C#

Resumo : neste tutorial, você aprenderá como C# chama os construtores da classe base e da subclasse.

A ordem de chamada do construtor

Quando você cria uma nova instância de uma subclasse, C# chama primeiro o construtor da classe base e depois o construtor da subclasse. Por exemplo:

Primeiro, defina uma Personclasse com um construtor sem parâmetros:

class Person
{ 
    public Person()
    {
        Console.WriteLine("Called the Person's constructor");
    }
}Linguagem de código:  C#  ( cs )

Observe que um construtor sem parâmetros de uma classe é o construtor que não possui parâmetros. Se você não especificar explicitamente um construtor sem parâmetros, o compilador C# gerará automaticamente um para a classe.

Segundo, defina uma Employeeclasse que herda da Personclasse:

class Employee : Person
{
    public Employee()
    {
        Console.WriteLine("Called the Employee's constructor");
    }

}Linguagem de código:  C#  ( cs )

Terceiro, crie uma nova instância da Employeeclasse:

var employee = new Employee();Linguagem de código:  C#  ( cs )

Saída:

Called the Person's constructor
Called the Employee's constructorLinguagem de código:  C#  ( cs )

Como você pode ver na saída, C# executa Personprimeiro o construtor da classe e depois o construtor da Employeeclasse.

Na verdade, C# sempre chama o construtor sem parâmetros da classe pai. Considere o seguinte exemplo.

Primeiro, adicione um construtor com o nameparâmetro para ambas Personas Employeeclasses:

class Person
{ 
    public Person()
    {
        Console.WriteLine("Called the Person's constructor");
    }

    public Person(string name)
    {
        Console.WriteLine("Called the Person's constructor with a parameter");
    }
}

class Employee : Person
{
    public Employee()
    {
        Console.WriteLine("Called the Employee's constructor");
    }

    public Employee(string name)
    {
        Console.WriteLine("Called the Employee's constructor with a parameter");
    }

}Linguagem de código:  C#  ( cs )

Segundo, crie uma nova instância da Employeeclasse:

var employee = new Employee("John Doe");Linguagem de código:  C#  ( cs )

Saída:

Called the Person's constructor
Called the Employee's constructor with a parameterLinguagem de código:  C#  ( cs )

Nesse caso, C# executa Personprimeiro o construtor sem parâmetros da classe (a classe base) e depois o construtor com um parâmetro da Employeeclasse (a subclasse).

Se você remover o construtor sem parâmetros da Personclasse e/ou da Employeeclasse, receberá um erro. Por exemplo:

class Person
{
    public Person(string name)
    {
        Console.WriteLine("Called the Person's constructor with a parameter");
    }
}

class Employee : Person
{
    public Employee(string name)
    {
        Console.WriteLine("Called the Employee's constructor with a parameter");
    }

}Linguagem de código:  C#  ( cs )

Erro:

There is no argument given that corresponds to the required formal parameter 'name' of 'Person.Person(string)'Linguagem de código:  C#  ( cs )

Neste exemplo, a Personclasse não possui um construtor sem parâmetros. Quando você cria uma nova instância da Employeeclasse, C# chama um construtor sem parâmetros da Personclasse.

No entanto, ele não consegue encontrar o construtor sem parâmetros na classe Person. Portanto, ele emite um erro.

Altere a ordem de chamada usando base()

Para corrigir o problema, você pode chamar explicitamente um construtor específico de uma classe pai em vez de permitir que o C# chame o construtor sem parâmetros.

Para fazer isso, você usa o base()após a declaração do construtor da subclasse da seguinte forma:

class Person
{
    public Person(string name)
    {
        Console.WriteLine("Called the Person's constructor with a parameter");
    }
}

class Employee : Person
{
    public Employee(string name): base(name)
    {
        Console.WriteLine("Called the Employee's constructor with a parameter");
    }

}Linguagem de código:  C#  ( cs )

Agora, se você criar uma nova instância da Employeeclasse:

// Program.cs

var employee = new Employee("John Doe");Linguagem de código:  C#  ( cs )

C# chamará Personprimeiro o construtor da classe e depois o construtor da Employeeclasse:

Called the Person's constructor with a parameter
Called the Employee's constructor with a parameterLinguagem de código:  C#  ( cs )

Herança C# e exemplo de construtor

Primeiro, defina a classe Person com um construtor que possui três parâmetros:

// Person.cs
class Person
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public byte Age { get; set; }

    public string FullName => $"{FirstName} {LastName}";

    public Person(string firstName, string lastName, byte age)
    {
        FirstName = firstName;
        LastName = lastName;
        Age = age;
    }

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

}Linguagem de código:  C#  ( cs )

Segundo, defina o Employee com um construtor que possui cinco parâmetros:

// Employee.cs
class Employee : Person
{
    public string JobTitle { get; set; }
    public decimal Salary { get; set; }

    public Employee(string firstName, string lastName, byte age, string jobTitle, decimal salary)
        : base(firstName, lastName, age)
    {
        JobTitle = jobTitle;
        Salary = salary;
    }
}Linguagem de código:  C#  ( cs )

Nesta classe, o construtor do Employee chama o construtor da Person usando a base()sintaxe.

Resumo

  • Na herança, C# sempre chama o construtor sem parâmetros da classe pai, a menos que você use o base()para chamar o construtor específico da classe pai.

Deixe um comentário

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