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 struct
s)
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 interface
s en les séparant de interface
s 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;
}
}
Vous devez vous connecter pour publier un commentaire.
Je pense que tout le monde a martelé le point d'une interface ayant que des membres du public, pas de détails de mise en œuvre. Ce que vous cherchez est un classe abstraite.
Edit: Il est juste d'affirmer que, si nous avons un PlasticOrange qui dérive d'une classe de l'Ornement, il ne peut mettre en œuvre IOrange et non les Graines méthode protégée. C'est très bien. Une interface, par définition, est un contrat entre un appelant et un objet, et non entre une classe et ses sous-classes. La classe abstraite est aussi proche que nous arrivons à ce concept. Et c'est très bien. Ce que vous proposez est une autre construction dans le langage à travers lequel nous pouvons changer les sous-classes d'une classe de base à un autre sans rupture de la construction. Pour moi, ce n'est pas logique.
Si vous créez une sous-classe d'une classe, sous-classe est une spécialisation de la classe de base. Il devrait être pleinement conscient de tous les membres protégés de la classe de base. Mais si vous voulez tout à coup de l'interrupteur de la classe de base, il ne fait aucun sens que la sous-classe devrait fonctionner avec tous les autres IOrange.
Je suppose que vous avez une bonne question, mais il semble comme un cas de coin et je ne vois pas en profiter pour être honnête.
NavelOrange
etValenciaOrange
à la même chose. Supposons une classePlasticOrange
déjà dérive deOrnament
.Ne vois pas pourquoi voudrait-on cette. Si vous voulez de la classe dérivée pour fournir une implémentation d'une méthode particulière, rendez-vous pour les classes de base abstraites. Les Interfaces ne sont que des interfaces. Un contrat public, rien d'autre. Penser à l'interface de spécification qui décrit comment la mise en œuvre de regarder vers le monde extérieur. Un cahier des charges pour les deux broches de la fiche n'est pas l'état (du moins je suppose) que c'est la structure interne devrait être. Il doit être compatible avec une prise de courant.
(source: made-in-china.com)
Parce qu'il n'a pas de sens. Une interface est un exposé publiquement contrat. Je suis un IThing, donc je vais effectuer IThing méthodes, si demandé. Vous ne pouvez pas demander à un IThing pour confirmer qu'il effectue des méthodes, il ne peut pas vous en parler.
public
méthodes. Pourquoi je ne peux pas lui demander d'exécuter supplémentaires IThing méthodes dans ce contexte?Interfaces existent pour permettre aux personnes d'accéder à votre classe sans savoir ce que la mise en œuvre concrète est. Complètement divorices la mise en œuvre de la transmission de données du contrat.
Donc, le tout dans une interface doit être public. Non-membres du public ne sont utiles que si vous avez accès à la mise en œuvre et, par conséquent, ne pas contribuer de manière significative à une définition d'interface.
Membres Interface sont une API publique; des choses comme
protected
etc sont des détails de mise en œuvre - et les interfaces ne sont pas ont toute mise en œuvre. Je soupçonne ce que vous cherchez est à l'implémentation d'interface explicite:public
, donc c'est pas vraiment ce que je cherche. Plus précisément, je suis en train de penserprotected
membres de fournir une API entre les ensembles de classes de base et de leurs héritiers.Une interface est un contrat qui promet un certain nombre de fonctionnalités pour les clients. En d'autres termes, le but de l'interface est d'être en mesure de jeter un type, et de les passer comme ça pour le code qui doit les caractéristiques de la garantie de cette interface. Depuis le code client d'un type ne peut pas accéder aux membres protégés de ce type, il ne fait aucun sens pour déclarer les éléments protégés dans une interface.
Une interface est juste comme la forme d'une clé.
Ce n'est pas la clé.
Ce n'est pas la serrure.
C'est juste le slim point de contact.
Pour cette raison, tous les membres de l'interface (qui définit la forme de la clé) doit être publique.
Pour une clé pour ouvrir une serrure, il est important qu'ils partagent tous deux la même forme.
En faisant de la forme (l'interface) public, vous pouvez laisser les autres à créer compatible serrures ou des clés compatibles.
Sinon, la rendant (l'interface) interne vous ne sera pas permettre à d'autres de créer compatible serrures ou des clés compatibles.
Une interface est tout au sujet de ce qu'un objet peut le faire, de sorte que lors de l'utilisation d'une classe qui implémente cette interface, le développeur s'attendre à tous les membres à mettre en œuvre, de sorte que le protégé modificateur d'accès ne signifie rien pour les interfaces.
Il y a un bon jugement dans le courant de la conception des interfaces, c'est qu'il propose des maîtres d'œuvre d'une grande flexibilité. Rappelez-vous que, très souvent, les interfaces sont rédigés par cadre programmeurs et les acteurs sont différents des gens. Pour appliquer la mise en œuvre serait inutilement sévère.
Par la mise en œuvre d'une interface du type indique qu'il prend en charge un ensemble de méthodes. Si aucune de ces méthodes n'étaient pas publiques, il ne serait pas disponible pour les appelants, et donc le type ne prendrait pas en charge l'interface comme indiqué.
Une Interface ne contient que des membres du public. Moyen protégé, quel que soit le déclarant n'est disponible pour la classe et de la classe dérivée instances.
Toute classe qui implémente une .net de l'interface devra inclure les implémentations de tous les membres d'interface. En outre, toute classe peut exposer à une classe dérivée de ce que les membres il le souhaite. Exigeant une mise en œuvre d'une interface doit comprendre un membre qui ne sera utilisable à partir de classes dérivées ne servirait à rien, à moins que ce soit (1) un membre peut être visible à quelque chose en dehors de l'interface, ou (2) des implémentations d'interface pourrait employer des membres qu'ils n'ont pas eux-mêmes de définir. Si les interfaces ont été autorisés à inclure les classes imbriquées (qui peut accéder à l'interface
protected
membres), puisprotected
membres interface aurait du sens. En effet, ils pourraient être très utiles si une classe imbriquée à l'intérieur d'une interface pourrait définir des méthodes d'extension pour l'interface. Malheureusement, aucune installation de ce type n'existe.BTW, même sans être en mesure de nid de classes dans les interfaces, il serait toujours utile d'appliquer une
internal
modificateur d'accès à l'interface de membres, avec l'effet que seule l'assemblée où l'interface est définie seraient en mesure de définir des implémentations pour elle.