Comment puis-je empêcher l'héritage de méthodes ou de propriétés dans des classes dérivées ?!
3 Réponses :
Vous ne pouvez pas, dans ce cas, héritage est le mauvais outil pour le travail. Votre classe doit avoir la collection en tant que membre privé, puis vous pouvez exposer autant ou aussi peu que vous le souhaitez. p>
Le modèle que vous voulez est la composition ("HAS-A"), pas l'héritage ("IS-A"). La base de la base doit contenir une collection, pas hériter de la collecte. La base de la base peut alors choisir de manière sélective quelles méthodes ou propriétés à exposer sur son interface. La plupart de ces personnes peuvent simplement être passées qui appellent les méthodes équivalentes sur la collecte interne. P>
Marquage des choses privées dans les catégories enfant ne fonctionnera pas, car quiconque ayant une variable de type de base ( Si "est-a" vs "a-A" ne clique pas pour vous, pensez-y en termes de parents vs amis. Vous ne pouvez pas choisir vos parents et ne pouvez pas les retirer de votre ADN, mais vous pouvez choisir qui vous associez avec. P> collection x = nouveau dérivéclass () code>) sera toujours en mesure d'accéder aux membres "cachés" à travers le type de base. p>
essayer de cacher un membre public d'une classe dans une classe dérivée est généralement une mauvaise chose (*). Essayer de le cacher comme un moyen de s'assurer que cela ne sera pas appelé est encore pire et ne fonctionnera généralement pas de toute façon. p>
Il n'y a pas de moyen d'idiomatique normalisé, je sais que je sais que l'accès d'un membre protégé de classe parent d'être accessible dans un type sous-dérivé, mais déclarant qu'un nouveau membre public inutile d'un type clairement inutile serait une approche. La chose la plus simple serait une classe vide. Par exemple, si la classe Foo déclare une classe publique vide appelée Membewiseclone, les dérivés de FOO ne seront pas en mesure d'appeler Membewiseclone - probablement une bonne chose si Membewiseclone briserait les invariants de la classe FOO. P>
(*) La seule situation dans laquelle il est approprié est quand une méthode publique d'une classe dérivée renvoie un type plus spécialisé que la méthode correspondante dans la classe de base (par exemple, une méthode Caractory.Proceduce () peut renvoyer une voiture, tandis que La méthode FordExplorerFactory.Produce () peut renvoyer un FordExplorer (qui dérive de la voiture). Quelqu'un qui appelle une personne qui appelle produire () sur ce qu'ils pensent être un caractoriel (mais il se trouve être un ForDExplorerFactory) obtiendra une voiture (qui se trouve être un ForDExplorer ), mais une personne qui appelle une personne qui appelle () sur ce que l'on sait au moment de la compilation pour être un ForDExplorerFactory obtiendra un résultat connu au moment de la compilation pour être un FordExplorer. P>