Я склонен поддерживать явные реализации интерфейса над неявными, поскольку я думаю, что программирование против интерфейса в отличие от реализации, как правило, предпочтительнее, а также при работе с веб-службами часто является необходимостью.
Тем не менее, мне было интересно, почему следующее является незаконным с явным объявлением интерфейса и юридическим с неявным:
interface IConnection
{
string ConnectionString { get; }
}
class Connection1 : IConnection
{
// private set is illegal, won't compile
string IConnection.ConnectionString { get; private set; }
}
class Connection2 : IConnection
{
// private set is legal now, it is not part of the interface
string ConnectionString { get; private set; }
}
Я знаю, как это исправить, поскольку законно иметь как явный, так и неявный интерфейс, плюс я могу сделать реализацию неявного интерфейса полностью закрытой.
Тем не менее, мне интересно, почему это объясняется. Поскольку технически, внутренне скомпилированный частный метод set_IConnection_ConnectionString
не обязательно должен быть частью интерфейса, не так ли? Его можно просто рассматривать как вспомогательный сеттер, а не часть интерфейса, как это происходит в неявной ситуации реализации.
Обновление: как бонус, казалось бы, запутанный, и, на мой взгляд, не совсем правильная ошибка компиляции, которую вы получаете, следующая:
Модификатор доступности для доступа должен быть более строгим, чем свойство Connection1.ConnectionString
Извините, более ограничительный, чем private
, как... что?