Pourquoi ne puis-je pas avoir protégé les membres interface?

Qu'est-ce que l'argument contre déclarant protégé-accès membres sur les interfaces? C'est, par exemple, n'est pas valide:

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

Dans cet exemple, l'interface IOrange permettrait de garantir que des réalisateurs au moins fournir un OrangePips exemple à leurs héritiers. Si le réalisateur a voulu, ils pourraient étendre le champ d'application de plein 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 de protected membres sur les interfaces est de fournir un contrat de support pour héritiers (sous-classes), par exemple:

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

(Certes, ce ne serait pas travailler pour structs)

Je ne vois pas beaucoup d'un cas pour private ou internal modificateurs dans les interfaces, mais supportant à la fois public et protected modificateurs semble parfaitement raisonnable.


Je vais essayer d'expliquer l'utilité de protected membres sur interfaces en les séparant de interfaces entièrement:

Imaginons un nouveau mot clé C#, support, pour faire respecter héritier des contrats, de sorte que nous déclarons les choses comme suit:

public support IOrangeSupport
{
    OrangePips Seeds { get; }
}

Ce serait nous permet de contrat de 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, parce que les classes sociales s'impliquent déjà présent contrat en fournissant les protected membres en premier lieu.

Mais alors nous pourrions aussi le faire:

public interface IOrange : IOrangeSupport
{
   ...
}

Appliquant ainsi IOrangeSupport à toutes les classes qui implémentent IOrange et en leur demandant de donner particulier protected membres - qui n'est pas quelque chose que nous pouvons actuellement faire.

  • double possible de Non Membres du Public pour C# Interfaces
  • De chair sur cette question, considérons ce cas d'utilisation. J'ai une classe dérivée hérite d'une classe générique de base. Je veux ajouter un membre protégé qui peuvent être accessibles sur n'importe quel générique saveurs de la classe dérivée, mais n'est pas exposé au monde extérieur. class Base<T> { } interface IDerived { string Secret { get; set; } } class Derived<T> : Base<T>, IDerived { protected string Secret; protected void LearnSecret(IDerived other) { var x = other.Secret; } }
InformationsquelleAutor ajlane | 2009-02-05