Ho una classe base ShapeManager
con un elenco di forme che voglio enumerate()
. Poi c'è una specializzazione ColoredShapeManager
che vuole per elaborare specializzata ColoredShape
s invece di Shape
s:Condivisione di un elenco di tipo base con i bambini
+----------------+ +-------------------------------------+
| Shape | | ShapeManager |
|----------------| |-------------------------------------|
| + id: int | | # shapes: List<Shape> |
| | | |
| | | + ShapeManager() { |
| | | shapes.add(new Shape()); |
| | | } |
| | | |
| | | + abstract void enumerate() { |
| | | for (Shape s: shapes) { |
| | | // use s |
| | | } |
| | | } |
+----------------+ +-------------------------------------+
^ ^
| |
+ +
+----------------+ +-------------------------------------+
| ColoredShape | | ColoredShapeManager |
|----------------| |-------------------------------------|
| + color: int | | + ColoredShapeManager() { |
| | | shapes.add(new ColoredShape()); |
| | | } |
| | | |
| | | + abstract void enumerate() { |
| | | for (Shape s: shapes) { |
| | | // use (ColoredShaped) s |
| | | // will fail for Shapes |
| | | } |
| | | } |
+----------------+ +-------------------------------------+
Sono incerto se ShapeManager dovrebbero condividere shapes: List<Shape>
con i suoi figli Questo sembra viziato dal ColoredShapeManager.enumerate()
vuole processo ColoredShape
s. Quindi getterebbe gli elementi, tuttavia alcuni elementi (quelli aggiunti dalla classe base) sono di tipo Shape
e il cast fallirebbe.
cioè:
- Entrambi i tipi di forma finiscono nella lista
shapes
. enumerate()
nel gestore figlio dovrebbe avere accesso aColoredShape
.
Devo dividere l'elenco e creare elenchi privati in ciascuno dei due gestori? Quindi, enumerare il bambino dovrebbe solo scorrere il tipo "suo" di forme e chiamare lo enumerate()
del genitore all'inizio/fine.
http://www.asciiflow.com/#Draw ottimo strumento! –
La soluzione migliore dipende da ciò che si sta facendo con le forme. Ad esempio, se intendi disegnare le forme nel ciclo in 'enumerate' (che è una scelta sbagliata per il codice che mostri, secondo me), se stai per disegnare, allora tutte le forme - colorate e non-- avrà un metodo di estrazione. La combinazione dei metodi di chiamata sulla classe 'Shape', che si applicano a tutte le istanze e ai metodi di chiamata sulla classe 'ColoredShape', che non si applicano alle istanze 'Shape', quella miscela può determinare il modo migliore per farlo. –
L'intero punto della domanda è come usare le proprietà/proprietà specifiche di 'ColoredShape' (in questo esempio 'colori'). –