Если тот факт, что единственный способ сделать это с помощью ключевого слова new
вас беспокоит, то, на мой взгляд, вы думаете об интерфейсах неправильными.
Уверен, вы могли бы сказать, что IInherited
«наследуется от» IBase
; но что это на самом деле означает? Это интерфейсы; они устанавливают кодовые контракты. Скрывая свойство IBase.Property1
с new string Property1 { get; set; }
, вы не скрываете никаких функций. Таким образом, традиционная причина, по которой многие разработчики считают, что скрывать свою «плохую» вещь, - что она нарушает полиморфизм, в данном случае не имеет значения.
Задайте себе вопрос: что действительно Вопросы Что касается интерфейсов? Они обеспечивают гарантию ответа на определенные вызовы методов, не так ли?
Таким образом, учитывая следующие два интерфейса:
interface IBase
{
string Property1 { get; }
}
interface IInherited : IBase
{
new string Property1 { set; }
}
- Если объект реализует
IBase
, вы можете прочитать его свойство Property1
.
- Если объект реализует
IInherited
, вы можете прочитать его свойство Property1
(как и с реализацией IBase
), и вы также можете написать ему.
Опять же, здесь действительно ничего проблемного.
Я думаю, что существует путаница между наследованием классов и наследованием интерфейсов. Один интерфейс на самом деле не наследует другого, в том же классе наследует другой. Весь ваш код говорит о том, что IInherited также реализует IBase. Код в порядке, он просто вызывает предупреждение компилятора, потому что вы меняете подпись Property1 в интерфейсе. Вы можете очистить это с помощью нового. –
Как уже отмечалось многими другими, этот синтаксис невозможен, но я чувствую, что это должно быть. Если вы используете Reflection on Property1, будет метод Property1_get и метод Property1_set, поэтому логически кажется, что вы должны реализовать их отдельно. И отсутствие возможности сделать это определенно заставляет меня иногда дублировать код (или мириться с новым ключевым словом). – cedd