2009-12-07 2 views
2

J'essaie de créer une classe View offrant une disposition horizontale ou verticale en fonction de la manière dont elle est créée. J'utilise un délégué pour y parvenir. Lorsque j'instancie un objet View, je passe dans un gestionnaire de champs horizontal ou vertical, puis je lui délègue des appels. C'est un peu ce que fait la classe Screen dans blackberry.BlackBerry - Amusez-vous avec FieldManagers

En fait, je suis à la recherche les docs Blackberry pour l'écran pour voir ce qu'il appelle les délégués (donc je peux émulent que) et je remarque des appels comme celui-ci à l'écran ...

KeyChar booléen protégé (char c , int status, int time)

Délègue un événement de génération de clé au champ contrôlé avec focus. Cette méthode appelle Manager.keyChar (char, int, int) sur le gestionnaire de délégués de cet écran.

Alors je me rends immédiatement compte, comment appellent-ils une méthode protégée sur le délégué de l'écran? Ou les documents sont-ils faux et cette méthode n'est pas déléguée?

Quelqu'un sait-il comment ils accomplissent cela?

Répondre

0

J'ai réussi à trouver une solution à ce problème avec l'aide d'autres questions SO.

Ma solution consiste à créer une interface qui fournit les points d'accès publics aux méthodes protégées, puis à sous-classer la classe Manager et à la mélanger dans cette interface. La méthode publique appellera alors la méthode protégée de son super.

La classe View est ensuite passée à l'une de ces sous-classes Manager.

public interface ManagerDelegate { 
    Manager asManager(); 
    // Provide public access points to any protected methods needed. 
    void doProtectedMethod(); 
} 

public HorizontalDelegate extends HorizontalFieldManager implements ManagerDelegate { 
    public Manager asManager() { 
     return this; 
    } 
    public void doProtectedMethod() { 
     // call the Manager's protected method. 
     protectedMethod(); 
    } 
} 

public VerticalDelegate extends VerticalFieldManager implements ManagerDelegate { 
    public Manager asManager() { 
     return this; 
    } 
    public void doProtectedMethod() { 
     // call the Manager's protected method. 
     protectedMethod(); 
    } 
} 

public class View extends Manager { 
    private final ManagerDelegate mDelegate; 

    public View(ManagerDelegate inDelegate) { 
     mDelegate = inDelegate; 
    } 

    protected void protectedMethod() { 
     // Call into our delegate's public method to access its protected method. 
     mDelegate.doProtectedMethod(); 
    } 

    public void publicMethod() { 
     // For public delegated methods I can just get the Manager instance from 
     // the delegate and call directly. 
     mDelegate.asManager().publicMethod(); 
    } 
} 
0

me what protected means rappelant:

Une méthode protégée peut être appelée par toute sous-classe dans sa classe, mais pas par les classes non apparentées.

Cela ne répond pas directement à votre question, mais pourriez-vous étendre Screen (API here) au lieu de Manager puis appelez super(mDelegate) dans votre constructeur? Ensuite, sans doute, quelle que soit la magie nécessaire, tout va fonctionner? Mis à part cela, je vous suggère simplement de l'essayer et de voir si vous pouvez remplacer la méthode soi-disant protégée!