[PIPython] polimorfismo in python

Simone Piunno pioppo
Ven 19 Nov 2004 15:16:45 CET


On Wednesday 19 May 2004 11:19, Francesco Benincasa - ciccio2000 wrote:

> > In soldoni io vedo come soluzione migliore utilizzare metodi diversi
> > della tua classe per elaborare dati diversi, in qualche caso
> > "accorparne" qualcuno utilizzando i default (se il caso).
>
> Non so, ci ragiono un pò, cercherò la soluzione più elegante.
> Sai, è il mio progetto per l'esame di ingegneria del software, almeno
> una volta nella vita vorrei scrivere del codice "come Dio comanda" :-)

Ti propongo una soluzione alternativa ;)

class AbstractElement(object):
    def accept(self, visitor):
        visitor.visit(self)

class ConcreteElementA(AbstractElement):
    pippo = "elemento A"
    
class ConcreteElementB(AbstractElement):
    pluto = "elemento B"
    
class ConcreteElementC(AbstractElement):
    def __init__(self):
        self.a = ConcreteElementA()
        self.b = ConcreteElementB()
    def nome(self):
        return "elemento C"
    def accept(self, visitor):
        AbstractElement.accept(self, visitor)
        self.a.accept(visitor)
        self.b.accept(visitor)

class AbstractVisitor:
    def visit(self, element):
        classname = element.__class__.__name__
        method = getattr(self, 'visit_' + classname)
        if method:
            method(element)
        else:
            raise NotImplementedError, \
                "I don't know how to visit a %s" % classname

class ConcreteVisitor(AbstractVisitor):
    def visit_ConcreteElementC(self, element):
        print "visit_ConcreteElementC, riceve un", element.nome()
    def visit_ConcreteElementA(self, element):
        print "visit_ConcreteElementA, riceve un", element.pippo
    def visit_ConcreteElementB(self, element):
        print "visit_ConcreteElementB, riceve un", element.pluto
       
c = ConcreteElementC()
v = ConcreteVisitor()
c.accept(v)

Eseguendo ottengo:

visit_ConcreteElementC, riceve un elemento C
visit_ConcreteElementA, riceve un elemento A
visit_ConcreteElementB, riceve un elemento B

-- 
http://thisurlenablesemailtogetthroughoverzealousspamfilters.org



More information about the Python mailing list