модификатор доступа к элементам интерфейса с тем эффектом, что только сборка, в которой определен интерфейс, сможет определить любые реализации для него.
аргумент против объявления членов защищенного доступа на интерфейсах? Это, например, неверно:
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;
...
}
(Правда, это не будет работать дляstruct
s)
Я не вижу много причин дляprivate
или жеinternal
модификаторы в интерфейсах, но поддерживающие обаpublic
а такжеprotected
Модификаторы кажутся вполне разумными.
Я собираюсь попытаться объяснить полезностьprotected
участники наinterface
s, отделяя их от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
члены - это не то, что мы можем сделать в настоящее время.