Почему на языке c# нельзя присвоить переменой производного класса объект базового? - вопрос №1665496

15.10.15
1 ответ

Лучший ответ по мнению автора

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

допустимо только присвоение переменной типа предок, экземпляра типа потомок

в контекстах, где надо использовать и предков и потомков, в том числе несколько поколений, следует использовать типы переменных самого старшего предка, и использовать свойства и методы только те, которые были заданы у этого предка (хотя у потомков они могут быть переопределены, тогда для каждого экземпляра будет использован актуальный метод его поколения, собственно в этом суть наследования и переопределений)

а экземпляры следует создавать в других контекстах, где определяется какое поколение надо создать в конкретной ситуации этого контекста

обычно методы создания экземпляров называют фабриками и реализуют в виде статических методов (их можно вызывать не имея ни одного созданного экземпляра класса)

ps строго говоря это не особенность C# — это каноны ООП как такового. это ограничение будет действовать во всех языках объектной парадигмы со строго типизацией

при этом, если язык допускает перегрузку операторов (а C# допускает) можно переопределить оператор присвоения для создания неявного приведения типов

в теле такого оператора надо будет создать экземпляр базового класса и задать ему свойства на основе значений экземпляра производного класса, и вернуть его как результат выполнения оператора

надо понимать что передать особенности потомка при этом все равно невозможно. можно клонировать только те свойства, которые уже были у предка

и надо помнить что это самостоятельный обьект. манипуляции с ним ни как не отразятся на экземпляре класса потомка. надо будет быть очень внимательным при дальнейшем выборе — каким экземпляром продолжать пользоваться?
15.10.15
Лучший ответ по мнению автора
Посмотреть всех экспертов из раздела Технологии > .Net/C#
Пользуйтесь нашим приложением Доступно на Google Play Загрузите в App Store