données protégées dans la classe abstraite
Ma question porte spécifiquement Java, les classes abstraites, et l'utilisation de données protégées. Je me dit que toutes les données doivent être privé, et protégé des getters/setters utilisé seul.
Maintenant, je comprends que nous voulons pour protéger les données à partir de la manipulation directe par les utilisateurs occasionnels de la classe, et que les membres de données en général sont une pratique incertaine. J'ai regardé "la Java des champs protégés vs public getters" ( Java des champs protégés vs public getters ), mais je suis encore douteux que:
protected int i;
qui est pire, dans une classe abstraite que:
private int i;
protected int geti();
protected void seti(int j);
Je suis tout simplement pas voir le côté vers le bas lorsque la classe abstraite est là justement pour fournir aux parents/installation commune aux enfants des classes, et le champ d'application est destinée à fournir l'accès aux enfants, tout en protégeant les données d'utilisateurs occasionnels. Je note dans la question mentionnée ci-dessus, que la plupart des réponses semblent répondre à la question du pourquoi de données en général devrait être privé plutôt que public. Je suis en train de concentrer ma question spécifiquement sur les données existantes dans un résumé parent prévu pour une utilisation par les enfants. La seule raisonnable commentaire que j'ai entendu à ce jour est que l'utilisation de la parents de données protégées (par exemple, int i ci-dessus) vous laisse avec le code dans la classe enfant qui fait référence à une variable non déclarée dans la classe enfant. Moins convaincante est l'argument (voir Commun des données protégées membre dans la classe de base? ) que vous voulez modifier l'accès à certains jours, et maintenant vous avez de l'honneur de votre interface. C'est une classe abstraite, et est destiné à être étendu à 100% du temps.
Merci! Titre/page# références à des livres sont beaucoup plus utiles que les références à "..toute base de programmation Java texte..."
========================================== 10-13-2010
C'était autant une question sur les classes abstraites comme il est sujet à des données protégées. Je trouve ça décevant que l'accent semble avoir changé dans les réponses pour savoir si les données de masquage est une bonne chose en programmation orientée objet (réponse: oui). Il y a beaucoup de profondeur sur la nature de la classe abstraite, et en quoi elle diffère d'un non-classe finale, et quels avantages il peut y avoir pour la fixation des noms et des types de données-éléments dans l'abstrait parent pour l'utilisation par l'enfant des classes. Je pense qu'il y a ici la possibilité pour l'innovation et un contrôle plus étendu vers le bas à partir de l'abstrait parent à la mise en œuvre de classes enfant. Je suis inquiète de ce que les principes généraux, tels que les avantages de données-se cacher, peut devenir un dogme, et freinent l'innovation et le développement de nouvelles idées et des schémas.
Merci à tous ceux qui ont contribué.
source d'informationauteur cvsdave
Vous devez vous connecter pour publier un commentaire.
Si le terrain est privé et l'accès se fait par des getters et setters, vous serez en mesure de réimplémenter les getters et les setters (par exemple, la suppression du champ et de la mise à jour/lecture de la valeur à partir d'une source externe), et donc changer la façon dont le "champ" des œuvres sans toucher toutes les classes enfant.
Si cela vaut la peine, c'est à vous.
Pense protégé méthodes interface pour les sous-classes, de la même manière que les méthodes publiques sont une interface pour tout le monde.
Fournir des accesseurs permet à la classe de base afin de maintenir son état: il n'y a aucune façon une sous-classe peut corrompre sans intentionnelle truc.
Ayant moins accès n'est pas un inconvénient, c'est un avantage. Les Classes toujours de limiter l'accès à autant de leur état interne que possible. Ne pensez pas pourquoi internes doivent être cachés, au lieu de penser pourquoi ils devraient être exposés. Dans ce cas, comme dans tous les cas, sauf si il y a vraiment une bonne raison pour exposer la variable, puis ne pas l'exposer.
Si vous n'avez pas besoin de votre enfant à directement y accéder, pourquoi voudriez-vous laisser ?
Ce n'est pas un inconvénient à l'utilisation protégé. Mais si il n'est pas nécessaire, peut-être que c'est mieux de l'éviter et de contrôler l'accès à vos champs.
En Java membres protégés sont accessibles à tous les membres dans le même paquet, en plus de toute l'extension de classes. Prise le domaine privé, prévenir les classes du même package d'accéder directement à elle.
Il y a aussi le point de alex soulevée plus tôt.
Si quelqu'un de votre sous-classes de la classe, et met le sous-classe dans le même package que votre classe actuelle, ils veulent peut-être remplacer votre getters et setters. Par exemple, ils wantto assurez-vous que
i
ne peut être réglé à une valeur supérieure à 1.Autre que cela, il est vraiment à vous. La convention est qu'il y a des getters et setters pour tout cela.
Se cacher de l'Information est précieuse, même parmi les classes liées par héritage.
En plus de permettre la re-mise en œuvre, comme indiqué par alex ci-dessus:
Vous souhaitez utiliser des getters/setters, parce que l'utilisation
protected int i;
permet de champ primordial (qui vous voulez éviter à tout prix).Vous voulez interdire le champ primordial car il fonctionne différemment de la redéfinition de méthode. Champ primordial de ne pas faire le substituée champ inaccessible (le type de la référence détermine l'exemple de la zone que vous travaillez avec).
Accessibles de domaines devraient être définitifs ou dans une classe, qui est définitive.
À première vue, cela ressemble à quelque chose qui serait tout simplement de rendre le code difficile à lire, mais elle a des conséquences sur la fonctionnalité. Dire que le champ est remplacée par une classe dérivée, depuis les poseurs ne sont pas utilisés, il n'existe aucun moyen pour automatiquement mettre à jour le champ de base et aucun moyen de détecter si quelqu'un a modifié le champ de base (puisque la valeur de base est toujours accessible) et mise à jour de la dérivée du champ. Il est facile d'imaginer que la base et les états dérivés pourrait sortir de la synchronisation et que les erreurs sont difficiles à dépister. Il suffit de le mettre en fait un très fragiles API.
Malheureusement, il n'existe aucun moyen de se prémunir contre cette depuis la
final
mot-clé, qui protège contre l'écrasement, rend également les champs de l'écriture une fois. Donc pas accessible en écriture non-overloadable champs.Personnellement, je suis plutôt surpris de la langue concepteurs ont permis de primordial. L'avantage de l'utilisation de poseurs est que chaque niveau de la garantie de l'intégrité de son propre état et de la confiance que les classes dérivées n'ai pas accroché. Champ primordial est juste des ennuis.