12
votes

Comment éviter les méthodes de superclasse deviennent remplacées par la sous-classe dans l'objectif - C

Comme en Java:

une classe finale ne peut être sous-classée. Ceci est fait pour raisons de sécurité et d'efficacité . En conséquence, de nombreuses classes de bibliothèque standard Java sont finales, par exemple Java.Lang.System et Java.Lang.String. Toutes les méthodes d'une classe finale sont implicitement définitives.

Comment puis-je atteindre ce comportement dans l'objectif-C?


4 commentaires

Qu'entendez-vous par sécurité? Comment java.lang.string étant final améliorer la sécurité?


@jeremyP: Google "Utilisation finale en Java" Vous obtiendrez une réponse.


Essayé, aucun des plus sages. Qu'est-ce que vous signifie par sécurité. Lorsque j'entends le mot "Sécurité" dans un contexte de programmation, je pense généralement à des choses comme empêchant l'accès non autorisé à des données et des mots de passe et de cryptage tel que. Faire la finale de la classe de cordes n'ade pas à cet égard. Si vous voulez dire "robustesse", alors assez juste, Objective-C a des objets immuables, mais il appartient à la mise en œuvre de s'assurer qu'ils restent non éventuels.


Peut-être signifie-t-il que permettre aux tiers de modifier le comportement des classes principales telles que le système ou la chaîne leur permettra de «entrer dans le système» et d'effectuer des actions malveillantes. Sur les ios non jailbreakes, au moins, je ne pense pas que le code d'un tiers autre que le développeur de la demande puisse être chargé / exécuté au moment de l'exécution, mais il pourrait y avoir d'autres scénarios que je n'ai pas pensé à ...


3 Réponses :


11
votes

Vous ne pouvez pas. L'efficacité ne vient pas dedans. Si vous êtes gêné de la sécurité, n'utilisez pas l'objectif-c. Il y aura toujours un moyen de contourner toutes les mesures que vous prenez.


2 commentaires

Êtes-vous sûr de ne pas avoir de telles installations à Obj-C? Vous vouliez dire que obj-C ne fournit pas ce genre de sécurité?


Objective-C est fondamentalement ouvert - je peux faire n'importe quoi au moment de l'exécution, ajouter des cours, supprimer les propriétés, les implémentations de la méthode Swap, même compiler dynamiquement le nouveau code à la volée. Je peux le faire à toutes les classes, toutes les propriétés, même des ivars privées et toutes les méthodes. Maintenant, assurez-vous que vous pouvez utiliser toutes ces techniques pour ajouter des mesures de sécurité à votre code (cela ne serait certainement pas plus efficace). Mais les mêmes mesures seront toujours disponibles pour tous ceux qui souhaitent contourner vos techniques - de sorte que ce n'est pas le temps bien dépensé.



4
votes

Il n'y a pas d'équivalent final dans l'objectif-c. Il y a les mêmes modèles qui pourraient être une bonne alternative, ils vous donneront une meilleure séparation, mais ni la performance ni la sécurité:

  1. Si vous voulez seulement laisser certaines méthodes d'être écrasées à l'aide de Délégué Modèle pourrait être un meilleur choix.
  2. Si vous ne voulez pas de sous-classement du tout, vous pouvez utiliser le Abstract Factory modèle. Déclarez une interface publique + des méthodes d'usine et cachez les classes de mise en œuvre concrètes.

0 commentaires

7
votes

Comme cela a été dit un certain nombre de fois, vous ne pouvez pas.

Cependant, si vous faites une bibliothèque (qui est le seul cas dans lequel je pouvais voir cela pertinent, de toute façon), il y a quelques étapes que vous pouvez prendre. Eh bien, un, vraiment.

écrire, dans la documentation de la classe, que "cette classe n'est pas destinée au sous-classement". (réf. nsindexset ) ou "< ne remplace pas cette méthode. " (Réf. .

comme moyen d'explication, il convient de noter que (à peu près) tout ce qui se passe à Obj-C, et cela le sépare de C, arrive au moment de l'exécution et le temps d'exécution est donc de parler "juste là". Toute pièce de code peut inspecter, muter ou pervertir le temps d'exécution à leurs loisirs, ce qui rend l'obj-C une langue terriblement puissante; surtout en ce qui concerne sa structure "méta-langueur".


0 commentaires