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 Person
classe 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 Employee
classe que herda da Person
classe:
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 Employee
classe:
var employee = new Employee();
Linguagem de código: C# ( cs )
Saída:
Called the Person's constructor
Called the Employee's constructor
Linguagem de código: C# ( cs )
Como você pode ver na saída, C# executa Person
primeiro o construtor da classe e depois o construtor da Employee
classe.
Na verdade, C# sempre chama o construtor sem parâmetros da classe pai. Considere o seguinte exemplo.
Primeiro, adicione um construtor com o name
parâmetro para ambas Person
as Employee
classes:
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 Employee
classe:
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 parameter
Linguagem de código: C# ( cs )
Nesse caso, C# executa Person
primeiro o construtor sem parâmetros da classe (a classe base) e depois o construtor com um parâmetro da Employee
classe (a subclasse).
Se você remover o construtor sem parâmetros da Person
classe e/ou da Employee
classe, 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 Person
classe não possui um construtor sem parâmetros. Quando você cria uma nova instância da Employee
classe, C# chama um construtor sem parâmetros da Person
classe.
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 Employee
classe:
// Program.cs
var employee = new Employee("John Doe");
Linguagem de código: C# ( cs )
C# chamará Person
primeiro o construtor da classe e depois o construtor da Employee
classe:
Called the Person's constructor with a parameter
Called the Employee's constructor with a parameter
Linguagem 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.