Конечно, сущность может изменить свой тип runtime во время выполнения. Он просто не может изменить тип compile . Это связано с тем, что c# является безопасным типом языка (один раз для данного типа, всегда для данного типа).
Предположим, у вас есть 3 класса - один абстрактный класс, скажем, Animal
и два класса, производных от него, скажем, Cat
и Dog
. Тогда
Animal animal = new Dog(); //compile time type is Animal runtime type is Dog
Console.WriteLine(animal.GetType().Name); // Dog
...
animal = new Cat(); // compile time type is still Animal (c# is Type safe)
// but runtime type just changed to Cat;
Console.WriteLine(animal.GetType().Name); // Cat
Обратите внимание, что все время, пока вы программируете животное, не будет «просто объектом». Существо (компиляции) типа Animal имеет большой прилив - свойство bool IsAlive
, метод Breath()
и многое другое. Но когда вы пишете свой код (то есть время компиляции), у вашего экземпляра "animal" не будет Tail
(потому что не у каждого животного есть хвост). Вы можете получить доступ (например, к intellisense) только к тем вещам, которые, как вы уверены, есть (только к животным). Это все еще говорит о многом, но не так много, как конкретные подклассы. Это очень общая вещь, и это хорошая вещь.