10
votes

Quels sont certains des noms différents des termes et des concepts de l'objectif C par rapport à Java?

J'espérais faire une liste de certaines des différences entre Java et l'objectif C d'abeille ma confusion. Cela facilite l'explication de mes difficultés quand je sais ce que les choses sont appelées.

Par exemple:

  • null - nil
  • Ceci - Self
  • Carte - Dictionnaire (même pas tout à fait sûr de celui-ci)

    Ce que je recherche, ce sont des comparaisons similaires ou des corrections à ceux que j'ai énumérées. Pas seulement limité aux éléments de la langue, mais aussi des concepts ...


1 commentaires

Techniquement nil et C null constante est la même chose (0), mais oui, les programmeurs de l'objectif-C utilisent généralement nil pour les pointeurs d'objet.


7 Réponses :


2
votes

Interface = Protocole

= Champ variable d'instance ( "Ivar")

ArrayList = Array

appeler une méthode = envoyer un message

Ceux que vous avez mentionnés sont corrects.


0 commentaires

12
votes

Vous avez raison sur la carte = Dictionnaire. J'ajouterai:

  • @public, @private, @protég (la valeur par défaut) est pour les variables d'instance uniquement (non méthodes) et fonctionnent comme des modificateurs de visibilité de C ++ (c'est-à-dire que vous les déclarez comme des en-têtes de section plutôt qu'avant chaque variable).
  • Les méthodes de classe sont comme des méthodes statiques en Java
  • Il n'y a que deux structures de données: Nsdictionary et Nsarray (dans des variantes immuables et mutables). Celles-ci sont très optimisées et fonctionnent bien pour la plupart des situations. Pour tout le reste, il y a CHDaStructures
  • @interface ne fonctionne pas comme les interfaces de Java - il définit les variables d'instance et les méthodes d'une seule classe.
  • Vous avez besoin de fichiers d'en-tête. C est à blâmer pour cela. Ceci est à peu près nul, comme le maintien des choses est une douleur inutile.
  • Il n'y a pas de concept d'un "paquet". La chose la plus proche est un cadre, mais celles-ci ne devraient pas être utilisées comme des forfaits de Java (c'est-à-dire ne les créez pas pour organiser vos cours).
  • au lieu de "nouvelle classe ()", dis [[Class Alloc] init]. Pensez à "Alloc" comme le nouvel opérateur et init comme constructeur.
  • ID est des pointeurs d'objet génériques, tels que des références d'objet de type dans Java.
  • La classe de base est NsObject. L'héritage de NsObject n'est pas automatique et doit être explicitement spécifié.

5 commentaires

Heureux que vous ayez signalé la différence entre ID et nsObject et comment les classes n'hérent pas de nsObject automatiquement.


Les méthodes de classe sont fondamentalement différentes des méthodes statiques, car les méthodes de classe sont expédiées de manière dynamique et peuvent être remplacées par des sous-classes. L'équivalent le plus proche d'une méthode statique est une fonction C droite. NsObject n'est pas la classe de base , c'est une classe de base . L'alternative la plus courante est la nsproxy. Oh, et il y a aussi nsset et nscoundset. :-)


+1 pour la pointe sur conceptualisant alloc / init. Expliquer l'idiome aux développeurs d'autres langues est toujours un peu difficile. Et merci d'avoir recommandé CHDATRACUCTURRES - Je suis content de les gens comme ça! :-)


J'ai un boeuf avec le point "alloc = nouveau" et "init = constructeur". Voir ma réponse à propos de Alloc et d'init.


J'ai lu "[[[CLASS ALLOC] init]" peut être écrit comme "[CLASSE NEW]", non?



2
votes

éteint le dessus de ma tête:

  • sérialisation = archivage
  • Les variables d'instance sont généralement accessibles via des propriétés au lieu d'accesseurs d'obtention / de configuration explicite. (Dans les vieux jours, nous avions l'habitude d'écrire des accesseurs aussi, mais même alors, ils seraient généralement de la forme FOO / setfoo plutôt que getfoo / setfoo .)
  • Un écouteur d'action / bouton / souris / événement est approximativement équivalent à un ibaction , bien que la façon dont Guis soit conçue dans le cacao est assez différent de Java.
  • au lieu d'une seule classe Bloc, les définitions de classes sont définies par un @interface (pour les variables d'instance et les déclarations de méthode) et un @Implementatation (pour le code de méthode réel) Directive.

1 commentaires

Bien que l'archivage clé soit beaucoup plus robuste que la plupart des solutions de sérialisation en Java. :-)



3
votes

Une autre différence conceptuelle est le comportement lorsque vous appelez des méthodes (envoyant des messages) sur des objets NULL (à nul).

Java strong> p>

id myObject = nil;
[myObject doSomething]; <-- is valid


1 commentaires

Remarque: vous obtenez seulement une nullpointerException si "DOSMATHIGH" n'est pas statique.



0
votes

au lieu d'utiliser des itérateurs pour une énumération facile, vous utilisez généralement, pour les classes qui implémentent le protocole de fixation de la fixation (interface en Java), un simple

pour (class * élément dans le conteneur)

http://developer.apple.com/documentation /Cocoa/conceptual/objectivec/articles/ocfastenumage.html


1 commentaires

Depuis Java 1.5, il y a un pour (élément de classe: conteneur) construction qui fonctionne sur tout ce qui implémente iTrable.



2
votes

réponses précédentes couvrent la plupart des différences de « phrasebook », mais il y a plusieurs différences conceptuelles clés qui méritent d'être mentionnés ... (Notez que je ne mentionne que pures questions Objective-C, pas de cacao.)

  • Il y a un espace de noms plat pour les classes, et un pour les protocoles. Il n'y a pas une telle chose comme des paquets ou des hiérarchies de package. Tous les noms de classe doivent être distincts (et tous les noms de protocole doivent être distincts) dans une application. Ceci est généralement accompli en utilisant ~ préfixe 2 lettres. Exceptions
  • sont réservés à des flux exceptionnels, presque toujours le résultat d'une erreur de programmation. Les raisons pour lesquelles 95% + des exceptions Java sont mieux servis en retournant un NSError si nécessaire.
  • Pensez à utiliser les catégories au lieu d'une compensation sous-classes, mais les deux devraient se faire judicieusement et avec précaution. (Catégories font la hiérarchie d'héritage moins de contraintes, mais affectent tous instances d'une classe. Ils sont souvent un bon choix quand vous le feriez normalement sous-classe, comme pour les éléments d'interface.) Fréquemment (dans les deux Objective C et Java) meilleur la solution est d'utiliser à la place composition.
  • Vous pouvez utiliser le typage dynamique presque partout comme on le souhaite, juste être conscient qu'il est une épée à double tranchant. Il se débarrasse de la nécessité d'un grand nombre de moulages, mais des erreurs qui seraient pris au moment de la compilation en Java sont poussés à l'exécution en Objective-C. Le typage statique peut être utilisé partout comme on le souhaite, et offre une plus grande sécurité à la compilation. (Les développeurs Java considèrent souvent la saisie non statique comme une carence linguistique, mais feraient bien de comprendre la flexibilité qu'il permet.)
  • Vous pouvez mélanger la fonctionnalité C et les bibliothèques librement sans wrappers JNI. Mais vous obtenez également toutes les cochonneries et les limites de droit Oui C, ce serait merveilleux si nous pouvions en finir avec la nécessité pour les fichiers d'en-tête, mais il est tout simplement pas qui va se passer pour les langues à base C. La vie est pas toujours juste. : -)

0 commentaires

3
votes

Une réponse philosophique à propos de Alloc / init.

init n'est pas un constructeur. Conceptuellement, "construction" n'existe pas dans l'objectif-c. En Java (et d'autres langues avec des constructeurs), appeler le constructeur retournera une nouvelle instanciation de l'objet prêt à partir. il n'y a pas d'équivalent exact à cela dans l'objectif-c em>. (On pourrait affirmer que les méthodes de la classe de commodité telles que la matrice + + TaryWithObjects, etc. sont des constructeurs techniquement, car ils enveloppent à la fois l'allocation et l'initialisation, mais je dirais qu'ils ne sont toujours pas des constructeurs au même sens que les constructeurs Java.) P>

Ce que nous avons à la place est le concept d'allocation et d'initialisation, deux étapes distinctes qui, lorsqu'elles sont exécutées ensemble, agissent comme s'il s'agissait d'un "constructeur". La méthode de classe + ALLOC demande simplement une pièce de mémoire de taille appropriée du système. IIRC, il utilise la fonction calloc () pour le faire. Il n'est pas garanti que tout soit à zéro aura lieu pendant l'exécution de la fonction Alloc. Cela signifie que nous devons faire l'initialisation de nous-mêmes, que nous faisons par immédiatement em> appelant une méthode -Il. P>

Cependant, - et tous les dérivés) ne sont rien de plus que l'ordinaire Méthodes d'instance. Vous pouvez les envoyer à chaque fois que vous le souhaitez afin de "réinitialiser" une instance d'objet à son état initial initial (bien qu'il existe certaines ramifications de la gestion de la mémoire de faire cela qui doit être prise en compte). Cela signifie également que vous pouvez faire quelque chose de ridicule comme celui-ci: P>

- (id) initWithCapacity:(NSUInteger)initialCapacity {
  if (self = [super init]) {
    [self setInitialCapacity:initialCapacity];
  }
  return self;
}

- (id) init {
  return [self initWithCapacity:0];
}


3 commentaires

C'était très utile. Merci!


Je reste derrière ma comparaison. Le nouvel opérateur agit sémantiquement comme un allocator et le constructeur en tant qu'indemizeur. Les constructeurs n'allouent pas de mémoire non plus - ils obtiennent des objets prêts à partir, tout comme les méthodes init font. Oui, les détails diffèrent (et j'ai appris certaines choses de votre message), mais à attendre que ce soit des langues très différentes. Cela ne signifie pas que la comparaison est sans valeur.


De plus, je envisage des méthodes de commodité telles que + TarywithObjects pour être plus proches des méthodes d'usine Java que des constructeurs Java. :)