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

аргумент против объявления членов защищенного доступа на интерфейсах? Это, например, неверно:

public interface IOrange
{
    public OrangePeel Peel { get; }
    protected OrangePips Seeds { get; }
}

В этом примере интерфейсIOrange будет гарантировать, что разработчикипо крайней мере обеспечитьOrangePips экземпляр их наследникам. Если разработчик хотел, они могли бы расширить область до полнойpublic:

public class NavelOrange : IOrange
{
    public OrangePeel Peel { get { return new OrangePeel(); } }
    protected OrangePips Seeds { get { return null; } }
}

public class ValenciaOrange : IOrange
{
    public OrangePeel Peel { get { return new OrangePeel(); } }
    public OrangePips Seeds { get { return new OrangePips(6); } }
}

Намерениеprotected Участники на интерфейсах, чтобы обеспечить контракт на поддержкунаследники (подклассы), например:

public class SpecialNavelOrange : NavelOrange
{
    ...
    // Having a seed value is useful to me.
    OrangePips seeds = this.Seeds; 
    ...
}

(Правда, это не будет работать дляstructs)

Я не вижу много причин дляprivate или жеinternal модификаторы в интерфейсах, но поддерживающие обаpublic а такжеprotected Модификаторы кажутся вполне разумными.

Я собираюсь попытаться объяснить полезностьprotected участники наinterfaces, отделяя их отinterfaceцеликом и полностью:

Давайте представим новое ключевое слово C #,support, для обеспечения исполнения договоров с наследниками, чтобы мы объявляли вещи следующим образом:

public support IOrangeSupport
{
    OrangePips Seeds { get; }
}

Это позволило бы нам заключать классы для предоставления защищенных членов их наследникам:

public class NavelOrange : IOrange, IOrangeSupport
{
    public OrangePeel Peel { get { return new OrangePeel(); } }
    protected OrangePips Seeds { get { return null; } }
}

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

Но тогда мы могли бы также сделать это:

public interface IOrange : IOrangeSupport
{
   ...
}

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

Ответы на вопрос(12)

Ваш ответ на вопрос