next up previous contents index
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.


next up previous contents index
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