casting pour une classe abstraite...comment est-ce possible?

je suis en train de lire un livre sur les design patterns en java et je suis un newbie 🙂

http://www.amazon.com/Design-Patterns-Java-TM-Software/dp/0321333020/ sur le chapitre composite modèle, je suis tombé sur un code qui me énigmes, d'un plâtre pour une classe abstraite, j'ai pas bien compris ce qui se passe quand la sous-classe appelle le constructeur de la superclasse abstraite, pouvez-vous m'aider s'il vous plaît !!

le casting que je suis en train de parler dans le isTree( Set visité)

        MachineComponent c = (MachineComponent) i.next();
        if (visited.contains(c) || !c.isTree(visited)) 

Comment peut-on appeler le isTree méthode de la sous-classe après un casting pour sa super-classe abstraite
alors que le isTree méthode de superclasse abstraite?

Voici des extraits de deux classes:

package com.oozinoz.machine;
/*
 * Copyright (c) 2001, 2005. Steven J. Metsker.
 */

import java.util.*;
import com.oozinoz.iterator.ComponentIterator;

/**
 * Objects of this class represent either individual machines or composites of
 * machines.
 */

public abstract class MachineComponent {

    /*
     * Subclasses implement this to support the isTree() algorithm.
     */

    protected abstract boolean isTree(Set s);

    //rest of class omitted
}

2:

package com.oozinoz.machine;    
/*
 * Copyright (c) 2001, 2005. Steven J. Metsker.
 */

import java.util.*;
import com.oozinoz.iterator.ComponentIterator;
import com.oozinoz.iterator.CompositeIterator;

 /**
 * Represent a collection of machines: a manufacturing line, a bay, or a
 * factory.
 */

public class MachineComposite extends MachineComponent {
    protected List components = new ArrayList();

    /**
     * @param visited a set of visited nodes
     * @return true if this composite is a tree
     * @see MachineComponent#isTree()
     */

    protected boolean isTree(Set visited) {
        visited.add(this);
        Iterator i = components.iterator();
        while (i.hasNext()) {
            MachineComponent c = (MachineComponent) i.next();
            if (visited.contains(c) || !c.isTree(visited)) 
                return false;
        }
        return true;
    }

    //rest of class omitted
}
Veuillez formater votre code correctement, si vous allez juste dump ensemble de fichiers.

OriginalL'auteur user1125516 | 2012-01-02