Chamada de método virtual no construtor: por que é perigoso e como evitar?
Olá a todos! Sou um desenvolvedor C# iniciante e tive um problema. Uso o ReSharper e notei que ele emite um aviso: «Virtual member call in a constructor». Tenho uma classe base `Animal` e uma derivada `Dog`. No construtor de `Animal`, chamo o método virtual `Speak()` para definir um nome padrão. Eis o exemplo:
```csharp
public class Animal
{
public string Name { get; set; }
public Animal()
{
// ReSharper: Virtual member call in a constructor
InitializeName();
}
public virtual void InitializeName()
{
Name = "Unknown animal";
}
}
public class Dog : Animal
{
public override void InitializeName()
{
Name = "Buddy";
Console.WriteLine("Dog initialized!");
}
}
```
Quando crio `Dog dog = new Dog();`, espero que o nome seja "Buddy", mas às vezes obtenho um comportamento inesperado. Por que isso acontece? Afinal, o construtor da classe base é chamado antes do construtor...