¿Por qué no puedo tener miembros de interfaz protegidos?

¿Cuál es el argumento en contra de declarar miembros de acceso protegido en las interfaces? Esto, por ejemplo, no es válido:

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

En este ejemplo, la interfazIOrange garantizaría que los implementadoresal meno proporcionar unOrangePips instancia a sus herederos. Si el implementador quisiera, podría ampliar el alcance a fullpublic:

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); } }
}

La intención deprotected members en las interfaces es proporcionar un contrato de soporte para herederos (subclases), por ejemplo:

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

(Es cierto que esto no funcionaría parastructs)

No veo mucho caso paraprivate ointernal modificadores en las interfaces, pero admitiendo ambospublic yprotected modificadores parece perfectamente razonable.

Voy a tratar de explicar la utilidad deprotected miembros eninterfaces separándolos deinterfaces por completo:

Imaginemos una nueva palabra clave de C #,support, para hacer cumplir los contratos de herencia, de modo que declaremos las cosas de la siguiente manera:

public support IOrangeSupport
{
    OrangePips Seeds { get; }
}

Esto nos permitiría contratar clases para proporcionar miembros protegidos a sus herederos:

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

Esto no es particularmente útil, porque las clases ya implicarían este contrato al proporcionar elprotected miembros en primer lugar.

Pero entonces también podríamos hacer esto:

public interface IOrange : IOrangeSupport
{
   ...
}

AplicandoIOrangeSupport a todas las clases que implementanIOrange y exigirles que proporcionen un @ particulprotected miembros, que no es algo que podamos hacer actualmente.

Respuestas a la pregunta(12)

Su respuesta a la pregunta