Почему C# не позволяет делать Downcast от родителя к потомку? Интересно, почему C# принципиально не позволяет расширять базовый экземпляр, как в этом коде?class People { public string name; }
class Person : People { public uint id; }
static void Main(string[] args)
{
People jack = new People { name = "Jack" };
Person jack_passport = (Person)jack; // InvalidCastException
}
Хочется понять на теоретическом уровне.
Задача простая: моя библиотека возвращает экземпляр, я хочу его дополнить и использовать в другом своём приложении. Звучит красиво и архитектурно логично, чтобы в приложении расширить этот экземпляр и добавить туда своих данных. Но почему этого нельзя?
Остаются только какие-то странные варианты, типа копировать все свойства вручную, или создавать переменную с ссылкой на родительский объект. Или что ещё страннее - инициализировать экземпляр известного типа сразу в библиотеке, делать Upcast в базовый класс, а потом в своей проге через Downcast приводить к своему, и такое приведение работает. Такого способа по идее не должно существовать в природе, потому что библиотека не должна знать ни о каких производных классах.
Интересно ещё, какие существуют правильные подходы или архитектуры к тому что я хочу.

21 Авг 2019 в 06:59
212 +1
0
Ответы
1

C# не позволяет делать Downcast от родителя к потомку из-за того, что это нарушает принципы полиморфизма и безопасности типов. При попытке выполнить Downcast от объекта родительского класса к объекту потомка мы пытаемся обратиться к дополнительным свойствам и методам, которые могут быть у потомка, но которых у родителя нет. Такой Downcast может привести к ошибкам выполнения программы, поэтому компилятор C# не допускает подобные операции без явного преобразования типов.

Одним из способов расширения базового экземпляра без изменения самого объекта является использование паттерна декоратора. Суть паттерна заключается в том, что мы создаем новый класс-декоратор, который хранит ссылку на базовый объект и добавляет к нему новое поведение или данные. Таким образом, мы можем дополнить базовый объект, не изменяя его самого.

Еще один подход к такой задаче может быть использование интерфейсов. Вместо того чтобы работать с конкретным классом, можно работать с интерфейсом, который этот класс реализует. Таким образом, можно создать дополнительный функционал через интерфейсы, не изменяя основной класс.

Как альтернативу можно также использовать наследование и создание нового класса, который будет наследовать и расширять функциональность базового класса.

В целом, важно помнить об основных принципах объектно-ориентированного программирования, таких как инкапсуляция, полиморфизм и наследование, и стараться придерживаться их при проектировании архитектуры приложения.

20 Апр в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 588 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир