[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