2016-07-12 59 views
5

Dire che stavo usando una libreria di forme che hanno offerto:estendere la classe base concreta di gerarchia

class Shape 
class Circle extends Shape 
class Square extends Shape 

ma voglio introdurre il concetto di forme rosse. Non riesco a modificare la libreria, ma posso creare:

class RedShape extends Shape 

tuttavia questo non può essere facilmente esteso a RedCircle in quanto non può estendersi sia RedShape e Circle.

Non penso che lo schema decoratore funzioni abbastanza qui ma esiste una tecnica per raggiungere questo obiettivo?

+0

Penso che il modello decoratore sia in realtà la scelta migliore in questo caso, poiché non è possibile avere ereditarietà multiple –

risposta

1

Risposta breve può essere trovato in Effective java di Josh Bloch, Elemento 16: composizione di favore sull'eredità.


EDIT: La composizione è quello che si avrebbe bisogno di fare, davvero. Multiple inheritance is not allowed with java. Le persone hanno tried. Hanno un po 'di approaches. Sono writing papers a riguardo. Usano persino strumenti di generazione del codice, o proxy (non proxy jdk nel tuo caso, non può fare il proxy di una classe), ma niente è elegante come probabilmente vorrai.

+0

Questo dovrebbe probabilmente essere un commento. In alternativa, potresti darci qualche informazione su questa "risposta breve" oltre al link :) – Keiwan

+0

Non penso che la composizione sia la risposta in questo caso dato che 'RedShape' deve ancora essere un' Shape' per esempio quindi io può 'disegnare (Shape)' it. – DrYap

+0

Bene, non è possibile _rapporre una forma a meno che non si sappia cosa disegnare; in altre parole, l'astrattezza di una forma viene catturata dal suo metodo 'draw'. Quindi, spero che questa ipotetica libreria faccia 'Shape # draw' e un metodo' abstract'. –

0

Definire un'interfaccia Colorable con i metodi getColor e setColor e avere forme colorate implementarlo.