44 votes

Est-ce que C# et la notion de privé et protégé de l'héritage?

Est-ce que C# et la notion de privé / protégé de l'héritage, et si non, pourquoi?

C++


class Foo : private Bar {
 public:
   ...
 }; 

C#


public abstract NServlet class : private System.Web.UI.Page
{
    // error "type expected"
}

Je me suis mise en œuvre d'un "servlet comme" concept dans une .page aspx et je ne veux pas le béton de classe à avoir la capacité de voir le fonctionnement interne du Système.Web.L'INTERFACE utilisateur.La Page de base.

20voto

Brian Stewart Points 4553

C# permet publique héritage. C++ a permis à tous de trois sortes. Public héritage implicite "EST-UN" type de relation, et privé de l'héritage implicite "Est mis en œuvre En Termes De" genre de relation. Depuis la superposition (ou composition) accomplie dans une sans doute plus simple de la mode, privé de l'héritage a été utilisé uniquement lorsque cela est requis par des membres protégés ou des fonctions virtuelles requise, - selon Scott Meyers Effective C++, l'Article 42.

J'imagine que les auteurs de C# ne pas sentir de cette méthode de la mise en œuvre d'une classe par rapport à une autre est nécessaire.

8voto

Nick Alexeev Points 490

Non, il n'est pas. Ce qui aurait l'avantage de permettre à ce type de restriction?

Protégées et à l'héritage qui est bon pour l'encapsulation (se cacher de l'information). De protection* l'héritage est pris en charge en C++, mais elle n'est pas en Java. Voici un exemple de mon projet où elle serait utile.

Il y a une classe de base en tant que 3e partie-cadre**. Il a des dizaines de paramètres plus les propriétés et les méthodes permettant de les manipuler. La classe de base ne fait pas beaucoup de la vérification des paramètres individuels sont affectés, mais il va générer une exception, plus tard, si elle rencontre une inacceptable combinaison.

Je suis en train de faire un enfant en classe avec des méthodes pour l'attribution de ces paramètres (par exemple, exemple, l'attribution soigneusement conçu paramètres à partir d'un fichier). Il serait bien de nier le reste du code (en dehors de ma classe enfant) la capacité de manipuler les paramètres individuels et mess up.

Cela dit, je pense qu'en C++ (qui, rappelons-le, prend en charge privé et protégé de l'héritage), il est possible de jeter de la classe enfant à parent et d'obtenir l'accès à des parents membres du public. (Voir aussi Chris Karcher post) Encore, protégé de l'héritage améliore de se cacher de l'information. Si les membres d'une classe B1 doivent être vraiment cachés dans d'autres classes C1 et C2, il peut être organisé par un protégé variable d'une classe B1 dans C1 et C2. Protégé instance de B1 sera disponible pour les enfants de C1 et C2. Bien sûr, cette approche en elle-même ne fournit pas de polymorphisme entre C1 et C2. Mais le polymorphisme peut être ajouté (si désiré) en héritant C1 et C2 partir d'une interface commune I1.

* Pour des raisons de concision utilisera le "protégé" au lieu de "privé et protégé".

** La Mesure de National Instruments Studio dans mon cas.

  • Nick

5voto

bdukes Points 54833

Vous pouvez masquer hérité des Api d'être visible publiquement en déclarant que même des membres de votre classe en tant que privé, et à l'aide du mot clé new. Voir la Clandestinité par Héritage à partir de MSDN.

3voto

Chris Karcher Points 1449

@bdukes: Gardez à l'esprit que vous n'êtes pas vraiment cacher le membre. E. g.:

class Base
{
   public void F() {}
}
class Derived: Base
{
   new private void F() {}
}

Base o = new Derived();
o.F();  // works

EDIT: Mais il accomplit la même privé de l'héritage en C++, qui est ce que l'interlocuteur a voulu :)

3voto

Joel Martinez Points 453

Si vous voulez le NServlet classe pour ne pas savoir quelque chose sur la Page, vous devriez regarder dans l'aide de l'Adaptateur. Écrire une page qui sera l'hôte d'une instance de la NServlet classe. Selon exactement ce que vous faites, vous pouvez alors écrire un large éventail de classes qui ne savent à propos de la classe de base NServlet sans avoir à polluer votre API asp.net la page des membres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X