Ich habe mit Generika herumgespielt, und ich habe einige seltsame Dinge gesehen. Ich hoffe, ihr habt eine Erklärung dafür! Um alles einfacher zu machen, habe ich das "Problem" in einem Beispiel dargestellt:
namespace Lab
{
public class Animal
{
public Animal(string sound)
{
this.Sound = sound;
}
public string Sound { get; private set; }
public void Kick()
{
Printer.Print(this, Sound);
}
}
public class Dog : Animal
{
public Dog() : base("Bark, bark! I'll bite you!") { }
}
public class Printer
{
public static void Print<T>(T obj, string message)
{
System.Console.WriteLine("{0} says '{1}' \n", typeof(T).FullName.PadRight(10), message);
}
}
public static class Program
{
static void Main(string[] args)
{
Animal bird = new Animal("Tweet!");
Dog dog = new Dog();
System.Console.WriteLine("Kick bird:");
bird.Kick();
System.Console.WriteLine("Kick dog:");
dog.Kick();
System.Console.WriteLine("Print kick dog:");
Printer.Print(dog, dog.Sound);
System.Console.ReadLine();
}
}
}
Also, ich habe zwei Tiere in meinem Labor: einen Hund und einen Vogel. Wenn ich diese Tiere "trete", machen sie ein Geräusch. Der Drucker druckt das Geräusch und die Art des Tieres aus. Wenn ich das Programm ausführe, druckt es:
Vogel kicken: Lab.Animal sagt "Tweet!
Hund treten: Lab.Animal sagt 'Bellen, bellen! Ich werde dich beißen!'
Kick Dog drucken: Lab.Dog sagt 'Bellen, bellen! Ich werde dich beißen!'
Warum sagt mir der erste Tritt des Hundes, dass es sich um den Typ Lab.Animal
? Und... wie kann ich es dazu bringen, dass es zurückkommt Lab.Dog
?