2009-10-21 3 views
2

Disons que je veux créer une classe MyString qui est un wrapper pour java.lang.String. J'ai ajouté une nouvelle méthode appelée reverse.Existe-t-il un équivalent de super pour rediriger les appels de méthode aux champs internes dans les classes wrapper?

public class MyString { 
    private String text=null; 

    public MyString(String foo){ 
     text=foo; 
    } 

    public String reverse(){ 
     // implementation omitted 
     return reversedString; 
    } 
} 

Maintenant, String est final. Donc je ne peux pas l'étendre. Une façon d'avoir MyString soutien toutes les méthodes qui String prend en charge est en fournissant des implémentations de la méthode d'emballage telles que la méthode toCharArray():

public char[] toCharArray(){ 
    // redirect to String member field 'text' 
    return text.toCharArray(); 
} 

Est-il possible que je peux rediriger les appels de méthode au champ membre sans avoir à coder l'emballage la mise en oeuvre? Quelque chose de similaire à super?

Répondre

2

Non, cela ne peut pas être fait directement.

Vous pouvez définir une interface contenant toutes les méthodes de java.lang.String (ainsi que vos méthodes) et la mettre en œuvre avec un proxy dynamique redirection vers la mise en œuvre de la chaîne (avec toutes les conséquences négatives de dynamic proxies).

Probablement vous êtes mieux avec une conversion de type new MyString(string).reverse() malheureusement Java n'a pas C#'s extension methods ou Scala's implicit type conversions.

Il y a bien sûr plein de implémentations inversées, par exemple du apache commons library. Il est mis en œuvre dans un style procédural:

String reversed = StringUtils.reverse(string); 

(je pense que votre méthode inverse devrait revenir LaChaine accumulez pas si vous pouvez écrire: s.reverse().reverse()).

1

Je ne sais pas si je comprends parfaitement la question, mais finalement, si vous voulez que votre MyString ait les mêmes méthodes que String, alors à un certain niveau votre classe doit également avoir toutes les mêmes méthodes définies. Vous ne pouvez pas vraiment contourner cela.

Vous pouvez probablement trouver des moyens de sorte que pour chaque méthode, vous n'avez pas à taper return text.blah(), quelque chose de plus élégant que cela; mais je ne vois pas comment vous pourriez éviter d'avoir les définitions de la méthode dans votre MyString du tout.

+0

Oui. Je le réalise. Merci. – hashable

1

Vous ne pouvez pas faire cela car vous devez écrire les méthodes pour les exposer à l'utilisation. Mais, par exemple, vous pouvez utiliser la fonction "Create Delegates ..." de Netbeans et vous obtenez toutes les méthodes déléguées avec quelques clics de souris.

+0

Merci. Cela fonctionnerait certainement (bien que pas aussi élégant que j'espérais) :-) – hashable

Questions connexes