Использование ключевого слова 'new' для скрытия доступных для записи свойств от базового класса, на мой взгляд, плохая идея. Ключевое слово new позволяет скрыть член базового класса в производном классе, а не переопределять его. Это означает, что вызовы к таким членам, использующим ссылку на базовый класс, все еще обращаются к коду базового класса, а не к производному коду класса. C # имеет ключевое слово «virtual», которое позволяет производным классам фактически переопределять реализацию, а не просто скрывать ее. Есть довольно хорошая статья здесь , в которой говорится о различиях.
В вашем случае похоже, что вы пытаетесь использовать скрытие метода как способ введения ковариации свойства в C #. Однако у этого подхода есть проблемы.
Часто ценность наличия базового класса состоит в том, чтобы позволить пользователям вашего кода полиморфно обрабатывать типы. Что происходит с вашей реализацией, если кто-то устанавливает свойство Delivery, используя ссылку на базовый класс? Будет ли производный класс ломаться, если свойство Delivery НЕ является экземпляром ParcelDelivery? Такого рода вопросы вам нужно задать себе при выборе варианта реализации.
Теперь, если свойство Delivery в базовом классе не предоставляет установщик, у вас немного другая ситуация. Пользователи базового класса могут только получить свойство и не устанавливать его. Поскольку вы перенаправляете доступ к свойству обратно в базовый класс, доступ через базовый класс продолжает работать. Однако, если ваш производный класс не запечатан, классы, которые наследуют его, могут создавать проблемы такого же типа, скрывая свойство Delivery с собственной версией.
Как уже упоминалось в некоторых других постах, вы можете использовать дженерики как способ достижения различных типов свойств Delivery. Пример Джона довольно хорош в демонстрации этого. Существует одна проблема с подходом обобщений, если вам нужно извлечь из CustomerOrder и изменить свойство Delivery на новый тип.
Есть альтернатива дженерикам. Вы должны решить, действительно ли вы хотите установить свойство в вашем случае. Если вы избавитесь от установщика в свойстве Delivery, проблемы, возникшие при использовании класса Order, сразу исчезнут. Поскольку вы устанавливаете свойство доставки с помощью параметров конструктора, вы можете гарантировать, что все заказы имеют правильный тип стратегии.