Я играл с дженериками и видел некоторые странные вещи. Надеюсь, у вас есть объяснение! Чтобы все было проще, я привел «проблему» в пример:
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();
}
}
}
Итак, у меня в лаборатории есть два животных: собака и птица. Когда я "пинаю" этих животных, они издают звук. Принтер напечатает звук и тип животного. Когда я запускаю программу, она печатает:
Kick bird: Lab.Animal говорит: «Твитни!»
Пинайте собаку: Лаборатория животных говорит: «Лай, лай! Я тебя укушу! »
Распечатать собачку: Собака-лаборатория говорит: «Лай, лай! Я тебя укушу! »
Почему первый удар собаки говорит мне, что это тип Lab.Animal
?
И ... как я могу заставить его вернуть Lab.Dog
?