Из определения: Апкаст - приведение экземпляра производного класса к базовому
Фрагмент кода апкаста для примера. Класс Human производный от класса Mammal.
Human human = new Human();
Mammal mammal = (Mammal)human; //Upcast
- Если апкаст - это приведение экземпляра производного класса к базовому, то в данном случае экземпляр
humanклассаHumanдолжен был быть приведен к классуMammal. Но после этого фрагмента кода у экземпляраhumanсохраняются методы и переменные производного класса. В чем тогда выражается приведение к базовому классу? - Если апкаст - это создание нового экземпляра базового класса на основе экземпляра производного (в данном случае
mammalизhuman), то в чем разница между указанным выше кодом с апкастом и данным кодом:Human human = new Human; Mammal mammal = new Mammal();- ведь в итоге всё равно создается два экземпляра класса - производный и на основе его базовый?
P.S.: Я думаю, что мой вопрос не дублирует этот. Мой вопрос о технической стороне - почему апкаст был, а функционал остался как у производного класса.
humanостаётся со своим значением, а вот новый экземпляр базового классаmammalсоздаётся изhumanбез использования конструктора, только привидением. – Вася Воронцов Feb 05 '21 at 21:23List<Mammal>влезет объект любого типа, наследующего классMammal. Пример нужен, или так понятно? – aepot Feb 05 '21 at 21:26GetType(). Меняется лишь интерфейс для взаимодействия с реальным объектом, а за допустимостью этого следит компилятор. – SmorcIRL Feb 05 '21 at 22:07HumanиMammal. Во втором случае вы создаете 2 объекта двух разных типов. – SmorcIRL Feb 05 '21 at 22:13Mammal mammal = (Mammal)human;, а теперь попробуйтеConsole.WriteLine(mammal.GetType().Name);, и вы увидите, что реальный тип экземпляра не поменялся. После апкаста возможен даункаст с к тому типу, с которого был апкаст, напримерHuman h = (Human)mammal, но даункаст возможен только если объект соответствует типу, к которому вы его даункастите. То есть объектMammal m = new Mammal()выдаст ошибкуInvalidCastExceptionпри попытке даункастаHuman h = (Human)m. – aepot Feb 05 '21 at 22:18