Miglior design per le classi che disegnano oggetti ma non ereditano da JPanel

3

Sto facendo l'esercizio 10.1, pagina 476 dal libro Java: Come programmare, Early Objects di Paul e Harvey Deitel (10a edizione).

Modify the MyLine, MyOval and MyRectangle classes of GUI to create the class hierarchy as shown in picture below. Classes of the MyShape hierarchy should be “smart” shape classes that know how to draw themselves (if provided with a Graphics object that tells them where to draw). Once the program creates an object from this hierarchy, it can manipulate it polymorphically for the rest of its lifetime as a MyShape.

enter image description here

L'originale MyLine , MyOval e MyRectangle che dovremmo modificare, tutti ereditano da JPanel e quindi si colorano facilmente con l'aiuto di paintComponent() .

Tuttavia nell'esercizio MyLine , MyOval e MyRectangle devono ereditare da una classe diversa da JPanel (o MyShape o MyBoundedShape ).

Sto pensando a come affrontarlo. Una soluzione sarebbe la creazione di un'altra classe, ad esempio MyPanel che erediterebbe da JPanel . Quindi il costruttore in MyPanel riceverà un oggetto MyShape ( MyLine , MyOval o MyRectangle ) e lo disegna usando paintComponent() . In questo caso MyPanel dovrebbe anche sapere che tipo di oggetto è MyShape quindi dovrei eseguire più controlli con instanceof o passare un parametro a MyPanel indicando esattamente la forma a cui sono interessato quindi paintComponent() sa cosa disegnare.

Non sono davvero sicuro di quale sia la migliore pratica in questo caso.

    
posta Yos 13.11.2017 - 15:45
fonte

1 risposta

3

Utilizzare instanceOf funzionerà ma condannerà alla scrittura di codice procedurale. Se si desidera scrivere codice flessibile, considerare la possibilità di attenersi al polimorfismo.

MyPanel would also have to know what kind of object is MyShape

Bene, no. MyPanel dovrebbe solo sapere che contiene un oggetto MyShape su cui può chiamare paintComponent() . L'oggetto chiamato sa cosa fare in modo che l'oggetto chiamante non debba.

Questo è il bello del polimorfismo. Esattamente quello che devi fare è qualcos'altro.

Immagina che un addestratore di animali stia facendo uno spettacolo. Mentre ogni animale esce, deve allontanarsi dal pubblico per vedere quale è uscito. Lei dice al cane "abbaia" e abbaia. Dice al papero "ciarlatano", e ciarla. Dice al gatto "miagolare", e la ignora, perché è un gatto.

Se li avesse addestrati con il polimorfismo in mente, non avrebbe dovuto girarsi. L'anatra sarebbe uscita, lei avrebbe detto "parla" e sarebbe ciarlatano. Il cane usciva, diceva "parla" e abbaiava. Il gatto usciva, diceva "parla" e il gatto si leccava.

Fatto in questo modo l'allenatore non ha nemmeno bisogno di sapere con chi sta parlando.

    
risposta data 13.11.2017 - 18:26
fonte