Sono sicuro che questo deve essere stato chiesto prima, ma non riesco a trovare un esempio simile. Capisco bene il polimorfismo e il sovraccarico del metodo, ma qui è uno scenario apparentemente semplice con una soluzione che mi sfugge:gestione dei parametri simile al polimorfismo - OO semplice?
diciamo che ho una classe base con diverse classi derivate. Userò forme per questo esempio
base Shape
derived Circle extends Shape
derived LineSeg extends Shape
ecc
Ora, la forma ha un metodo chiamato intersecano (altro) che i test contro un'altra forma per vedere se si intersecano. Con il polimorfismo è facile vedere come Circle, LineSeg, ecc. Possono implementare i propri metodi "intersect" e, con l'overloading del metodo, posso facilmente implementare tutte le combinazioni necessarie. per esempio,
Circle.intersect(LineSeg)
Circle.intersect(Circle)
LineSeg.intersect(Circle)
ecc
finora tutto bene.
il problema è, se continuo a un elenco centrale di forme, io voglio fare questo:
for some shape s
Foreach shape in Shapes
if (s.intersect(shape)) - do something
Attualmente, io non sono sicuro di come questo sia possibile, dal momento che il metodo di sovraccarico seleziona il "Intersect" metodo per abbinare il tipo base Shape e non il tipo di parametro appropriato. Come posso farlo senza una catena if-else controllando i tipi e down-casting?
BTW, sto usando Java, ma non sono sicuro che la lingua sia del tutto pertinente poiché sembra essere una domanda di progettazione di base. Sembra così semplice, cosa mi sto perdendo?
Grazie!
Risolto sotto (Grazie!), Vedere i dettagli lì. Fondamentalmente, avendo una callback nelle classi derivate che poi chiama il metodo appropriato (un pattern visitor?), Puoi usare la "this" keyword per invocare il metodo intersect corretto, poiché ha il tipo corretto necessario.
Alcuni linguaggi di programmazione supportano l'overload sui tipi di runtime gli argomenti più direttamente.Ad esempio, LISP supporta * multimethods * e suppongo che alcuni dei linguaggi di programmazione funzionale supportino lo stesso. In Java, questo è solitamente chiamato * double dispatch *, e il pattern GoF Visitor è la strada da percorrere. –
Non mettere a tacere il tuo design, ma la tua eredità è un po 'sbagliata. I segmenti di linea non sono realmente forme. Formano forme. Dovresti controllare le intersezioni di una qualsiasi delle tante, a seconda della forma, dei segmenti di linea che costituivano le due forme in questione :) – ChiefTwoPencils
@ C.Lang, buona cattura, ma cosa succede se rinominare lineSeg su "wall"? questo è fondamentalmente il modo in cui è usato, ma chiamarlo lineSeg rende più facile concettualizzarlo usando altre forme più complesse. – user1922401