BlackBerry-S'amuser avec les gestionnaires de terrain

j'essaie de faire une classe de vue qui fournit une mise en page horizontale ou verticale selon la façon dont elle est créée. Je suis à l'aide d'un délégué pour atteindre cet objectif.

class View extends Manager {
    private Manager mDelegate;

    public View(Manager inDelegate) {
        mDelegate = inDelegate;
        // the delegate is the only child of "this" manager.
        super.add(mDelegate);
    }

    public void add(Field f) {
        // all other children go into the delegate.    
        mDelegate.add(f);
    }

    // other methods that also delegate

}

quand j'instancie un objet View je passe dans un gestionnaire de champ Horizontal ou Vertical et puis je délègue des appels à cela. C'est un peu ce que fait la classe D'écran dans blackberry.

en fait, je regarde les docs blackberry pour L'écran pour voir ce qu'il appelle les délégués (donc je je remarque des appels comme celui-ci à L'écran...

protected boolean keyChar (char c, int status, int time) ""

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

alors je me rends immédiatement compte, comment dans le monde appellent-ils une méthode protégée sur l'écran de délégué? Ou les médecins ont-ils tort et cette méthode n'est pas déléguée?

quelqu'un sait comment ils accomplir?

2
demandé sur Maksym Gontar 2009-12-07 22:12:08
la source

2 ответов

me rappelant ce qui est protégé signifie :

une méthode protégée peut être appelée par toute sous-classe de sa classe, mais non par des classes sans rapport.

cela ne répond pas directement à votre question, mais pourriez-vous prolonger Screen ( API ici ) au lieu de Manager et ensuite appeler super(mDelegate) dans votre constructeur? Alors, sans doute, quelle que soit la magie. nécessaire tout fonctionne?

mis à part cela, je vous suggère juste de l'essayer et de voir si vous pouvez outrepasser la méthode soi-disant protégée!

0
répondu Dan J 2009-12-09 23:57:22
la source

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

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

puis la classe View est 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
répondu Russell Zornes 2009-12-20 21:54:56
la source

Autres questions sur layout user-interface blackberry