Quel est l'argument contre la déclaration de membres à accès protégé sur les interfaces ? Cela, par exemple, est invalide :
public interface IOrange
{
public OrangePeel Peel { get; }
protected OrangePips Seeds { get; }
}
Dans cet exemple, l'interface IOrange
garantirait que les implémenteurs fournissent au moins une instance de OrangePips
à leurs héritiers. Si l'implémenteur le souhaitait, il pourrait étendre la portée à 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); } }
}
L'intention des membres protected
sur les interfaces est de fournir un contrat de support pour les héritiers (sous-classes), par exemple :
public class SpecialNavelOrange : NavelOrange
{
...
// Avoir une valeur de graine m'est utile.
OrangePips seeds = this.Seeds;
...
}
(Admettons que cela ne fonctionnerait pas pour des struct
)
Je ne vois pas vraiment de justification pour les modificateurs private
ou internal
dans les interfaces, mais soutenir à la fois les modificateurs public
et protected
semble parfaitement raisonnable.
Je vais essayer d'expliquer l'utilité des membres protected
sur les interface
s en les séparant entièrement des interface
s :
Imaginons un nouveau mot-clé en C#, support
, pour imposer des contrats d'héritage, de sorte que nous déclarions les choses comme suit :
public support IOrangeSupport
{
OrangePips Seeds { get; }
}
Cela nous permettrait de contracter des classes pour fournir des membres protégés à leurs héritiers :
public class NavelOrange : IOrange, IOrangeSupport
{
public OrangePeel Peel { get { return new OrangePeel(); } }
protected OrangePips Seeds { get { return null; } }
}
Ce n'est pas particulièrement utile, car les classes impliqueraient déjà ce contrat en fournissant les membres protected
dès le départ.
Mais alors nous pourrions également faire ceci :
public interface IOrange : IOrangeSupport
{
...
}
Appliquant ainsi IOrangeSupport
à toutes les classes implémentant IOrange
et leur demandant de fournir des membres protected
particuliers - ce que nous ne pouvons actuellement pas faire.
0 votes
Possible duplicate de Membres non publics pour les interfaces C#
1 votes
Pour approfondir cette question, considérez ce cas d'utilisation. J'ai une classe dérivée qui hérite d'une classe de base générique. Je veux ajouter un membre protégé qui peut être accédé sur l'une des variantes génériques de la classe dérivée, mais qui n'est pas exposé au monde extérieur.
classe Base { }
interface IDerived
{
string Secret { get; set; }
}
classe Derived : Base, IDerived
{
protected string Secret;
protected void LearnSecret(IDerived other)
{
var x = other.Secret;
}
}
0 votes
Je suis assez surpris que aucune des réponses ou des commentaires ne mentionne l'EIMI. L'EIMI rend le membre de l'interface privé lorsqu'il est vu à travers le point de vue du type implémentant.
1 votes
Peut-être venir en C# 8.0 jeremybytes.blogspot.com/2019/11/…