Aufruf einer virtuellen Methode im Konstruktor: Warum ist das gefährlich und wie vermeidet man es?
Hallo zusammen! Ich bin ein C#-Anfänger und habe ein Problem. Ich benutze ReSharper und habe bemerkt, dass er eine Warnung ausgibt: „Virtual member call in a constructor“. Ich habe eine Basisklasse `Animal` und eine abgeleitete Klasse `Dog`. Im Konstruktor von `Animal` rufe ich die virtuelle Methode `Speak()` auf, um einen Standardnamen zu setzen. Hier ist ein Beispiel:
```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!");
}
}
```
Wenn ich `Dog dog = new Dog();` erstelle, erwarte ich, dass der Name "Buddy" ist, aber manchmal erhalte ich unerwartetes Verhalten. Warum passiert das? Schließlich wird der Konstruktor der Basisklasse vor dem Konstruktor der abgeleiteten Klasse aufgerufen.