Даункастинг непопулярен, возможно, запах
Я не согласен. Даункинг чрезвычайно популярен ; огромное количество реальных программ содержат один или несколько downcast. И это не может быть запах кода. Это определенно кодовый запах. Вот почему операция даункейтинга должна быть указана в тексте программы . Это так, что вы можете легче заметить запах и уделить внимание проверке кода.
при каких обстоятельствах [s] уместно писать код, который преуменьшает?
В любых обстоятельствах, когда:
- у вас есть 100% правильное знание факта о типе выражения во время выполнения, который является более конкретным, чем тип выражения во время компиляции, и
- вам нужно воспользоваться этим фактом, чтобы использовать возможности объекта, недоступные для типа времени компиляции, и
- это лучше использовать время и усилия, чтобы написать актерский состав, чем реорганизовать программу, чтобы исключить любой из первых двух пунктов.
Если вы можете дешево реорганизовать программу, чтобы компилятор мог определить тип среды выполнения или реорганизовать программу, чтобы вам не требовались возможности более производного типа, тогда сделайте это. Даункасты были добавлены к языку для тех обстоятельств, когда трудно и дорого рефакторинг программы.
почему даункинг поддерживается языком?
C # был изобретен прагматичными программистами, у которых есть работа, для прагматичных программистов, у которых есть работа. Дизайнеры C # не являются пуристами OO. И система типов C # не идеальна; по своей конструкции он недооценивает ограничения, которые могут быть наложены на тип переменной во время выполнения.
Кроме того, downcasting очень безопасен в C #. У нас есть надежная гарантия, что downcast будет проверен во время выполнения, и если его невозможно будет проверить, тогда программа сделает правильные вещи и вылетит. Это замечательно; это означает, что если ваше 100% правильное понимание семантики типов окажется правильным на 99,99%, то ваша программа работает 99,99% времени и в остальное время вылетает, а не ведет себя непредсказуемо и портит пользовательские данные 0,01% времени ,
УПРАЖНЕНИЕ: есть по крайней мере один способ произвести даункаст в C # без использования явного оператора приведения. Можете ли вы вспомнить какие-либо такие сценарии? Поскольку это также потенциальные запахи кода, как вы думаете, какие конструктивные факторы были заложены в разработку функции, которая могла бы привести к падению с понижением при отсутствии явного приведения в коде?