¿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 parastruct
s)
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 eninterface
s separándolos deinterface
s 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.