Почему я не могу иметь защищенных членов интерфейса? - PullRequest
66 голосов
/ 05 февраля 2009

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

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 с)

Я не вижу особого смысла в модификаторах private или internal в интерфейсах, но поддержка модификаторов public и protected кажется вполне разумной. <Ч />

Я попытаюсь объяснить полезность protected членов на interface с, отделив их от 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 ]

0 голосов
/ 05 февраля 2009

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

0 голосов
/ 05 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...