Next: Le paradigme Target/Action
Up: Panoramique et comparaison de
Previous: Caractéristiques des classes
Extension ``verticale'' du code
Il est souvent nécessaire de rajouter de la fonctionnalité à une classe déjà
définie, c'est-à-dire, rajouter des méthodes, ce qui correspond à l'extension
verticale du code. Si on n'a à disposition que la notion de classe et
l'héritage, cela nous oblige à chaque coup à redéfinir une nouvelle sous-classe,
avec le désavantage évident que les objets obtenus en instanciant l'ancienne
classe n'ont pas accès aux nouvelle méthodes.
Or, certains langages, dont Objective-C, mais pas C++ ni Java, fournissent un
mécanisme simple pour faire cela, avec la notion d'extension verticale à l'aide
de ce qu'on appelle en Objective-C des catégories .
En Objective-C, une catégorie se déclare comme une classe, mais avec le nom de la catégorie entre parenthèses après le nom de la classe que l'on étend, et on peut déclarer seulement des nouvelles méthodes, et non pas des nouvelles variables d'instance (cela permet de faire travailler les nouvelles méthodes sur les anciens objets): ces méthodes ont accès à toutes les variables d'instance de la classe d'origine.
@interface ClassName ( CategoryName ) declarations des methodes de la categorie @end@implementation ClassName ( CategoryName ) definitions des methodes de la categorie @end
Comme on n'a pas besoin du code de la classe que l'on étend, ce mécanisme permet d'étendre les fonctionnalités d'un kit préexistant, et comme les nouvelles méthodes sont héritées par les sous-classes, cela est un mécanisme strictement plus puissant que l'héritage, si on n'a pas accès au code, vu que cela permet de faire travailler des vieux objets (préexistants) avec les nouvelles méthodes.
Par exemple, voici le fichier des déclarations des extensions de la classe List qui vient avec NEXTSTEP (sans code), extensions qui font partie du MiscKit:
// MiscListExtensions.h -- various extensions to List // Originally written by Drew Davidson and Don Yacktman // Copyright (c) 1994 by Drew Davidson. // Modified and extended by Don Yacktman for inclusion into the MiscKit. // Version 1.0. All rights reserved. // This notice may not be removed from this source code. // // This object is included in the MiscKit by permission from the author // and its use is governed by the MiscKit license, found in the file // "LICENSE.rtf" in the MiscKit distribution. Please refer to that file // for a list of all applicable permissions and restrictions. @interface List(Extensions) - deepCopy; - deepCopyFromZone:(NXZone *)zone; - makeObjectsPerform:(SEL)aSelector with:object1 with:object2; - makeObjectsPerformInOrder:(SEL)aSelector; - makeObjectsPerformInOrder:(SEL)aSelector with:anObject; - makeObjectsPerformInOrder:(SEL)aSelector with:object1 with:object2; - addLists:firstList, ...; - mergeLists:firstList, ...; @end@interface Object(MiscListForeach) // Make self perform aSelector once for each object in a List. The // object from the List is sent as the first argument to aSelector, // so aSelector should take a single argument of type id. - foreach:aList perform:(SEL)aSelector; // As above, but aSelector should take two arguments of type id. - foreach:aList perform:(SEL)aSelector with:anObject; @end
@interface List (MiscStringSort) / Assumes everything in the list is a MiscString -- no check is made. * This category is written by Bill Bumgarner and (C) Bill Bumgarner. / - miscStringSort; - miscStringSortCaseSensitive:(BOOL)aFlag; // added by DAY @end
// This next category is from R. Todd Thomas and was impl\'emented to // help support the MiscUser* classes.
@interface List (StringFinding) - (BOOL)matchString: (const char *)str usingSel: (SEL)comparator; @end
Cela sert aussi pour modulariser le développement d'une classe de grande dimension, en découpant en différents fichiers indépendants les détails des différents aspects de l'implémentation.
- on groupe ensemble les méthodes qui sont reliés, et on sépare celles qui ne le sont pas.
- on permet le développement en parallèle, et l'extension de code déjà écrit: voici
un extrait de la documentation de MiscSearchText du MiscKit pour NEXTSTEP
To incorporate this category into your project, instantly adding searching functionality to your existing Text objects, all you need to do is add the files MiscSearchText.m, MiscTBMK.c, and regexpr.c to "Other Sources" in your project file with ProjectBuilder, then add the files MiscSearchText.h, MiscTBMK.h, and regexpr.h to "Headers".
- on a une forme de compilation incrémentale pour la classe.
- on peut configurer différemment une classe pour différentes applications.
Next: Le paradigme Target/Action Up: Panoramique et comparaison de Previous: Caractéristiques des classes Roberto DiCosmo
Mon Jun 3 18:29:31 MET DST 1996