2009-11-07 11 views
4

J'ai un problème où je travaille avec une interface particulière pour beaucoup de choses. Cependant, j'ai une méthode particulière que je veux être disponible seulement à un groupe particulier de classes (fondamentalement, une méthode internal).Comment exposer une méthode dans une interface sans la rendre publique à toutes les classes

interface IThing { 
    function thisMethodIsPublic():void; 
    function thisMethodShouldOnlyBeVisibleToCertainClasses():void; 
} 

Le problème est, il n'y a pas moyen d'ajouter des modificateurs d'accès (c.-à-public, privé, interne) dans une interface - au moins pas dans ActionScript 3.0.

Je me demande quelle serait la meilleure pratique ici? Il semble que c'est une mauvaise forme de rendre cette méthode interne publique, mais j'ai besoin qu'elle fasse partie de l'interface pour que je puisse garantir que les classes qui l'implémentent ont cette méthode interne.

Merci pour votre aide!

Répondre

12

Réponse: Définissez deux interfaces, et de garder les fonctions « privées » dans la deuxième interface. Si ActionScript prend en charge l'héritage pour les interfaces, définissez l'interface «privée» comme une extension de l'interface «publique».

+0

+1 C'est la bonne façon. Et oui, ActionScript prend en charge l'héritage des interfaces. – Amarghosh

1

Une idée possible, je pensais juste serait de définir une seconde interface pour la méthode interne:

interface IThing { 
    function thisMethodIsPublic():void; 
} 

interface IInternalThing { 
    function thisMethodShouldOnlyBeVisibleToCertainClasses():void; 
} 

De cette façon, la méthode ne serait pas visible sans coulée de type lorsque vous travaillez avec IThing, mais serait quand vous tapez explicitement cast comme IInternalThing. Cela ne résout pas vraiment le problème mais rend cette méthode un peu plus cachée.

0

Peut-être utiliser les espaces de noms au lieu (ou en plus) à votre interface. Juste une pensée.

+0

C'était mon approche originale mais je me suis rendu compte que je devrais faire référence à la classe avec l'espace de noms personnalisé au lieu de l'interface. Bonne suggestion cependant. –

0

Désolé de continuer à répondre à ma propre question mais ... Une autre possibilité, un peu fou, serait de créer une sorte de verrou et de clé pour la méthode que je veux rendre privé similaire au SingletonEnforcer souvent utilisé dans AS3. Cela me semble trop compliqué mais je l'ai testé et ça marche! Les classes externes au InternalKey peuvent voir la méthode mais ne peuvent pas l'appeler. Cela garantit également que l'interface utilise la méthode en question au lieu de devoir effectuer un typage sur la seconde interface.

Il est également possible de faire la deuxième interface soit une interface interne au lieu d'utiliser la clé interne.

internal interface IInternalThing extends IThing { 
    function thisMethodShouldOnlyBeVisibleToCertainClasses():void; 
} 

En fait, ces deux ne sont pas exactement ce que je dois parce que je voulais faire la méthode exposée à un ensemble imbriqué dans le package où IThing serait, donc en gros je veux utiliser ici namespaces personnalisés mais je peux 't. Je vais probablement devoir déplacer les classes dans le paquet imbriqué dans le même pacakge que IThing.

0

Aujourd'hui, j'ai rencontré le même problème. Heureusement j'ai eu l'occasion de faire une superclasse au lieu d'interface. Au lieu d'utiliser ceci:

internal interface IPhysicalObject extends IIDObject { 

    function get shape():IShape; 

} 

J'ai écrit ceci:

public class PhysicalObject extends IDObject { 

    public function PhysicalObject():void { 

     ... 

    } 

    internal function get shape():IShape { ... } 

} 

Bien sûr, il est possible que si les classes qui mettent en œuvre l'interface IPhysicalObject ne se prolongent pas une autre classe.Je pense que c'est une autre solution possible.

Questions connexes