2009-07-17 1 views

risposta

23

In generale, l'estensione del componente tende a essere eseguita rigorosamente per utilizzare il componente. Questo limita fortemente le tue opzioni in modi non necessari in termini di progettazione, in modo che le tue classi non possano estendere classi diverse, non puoi nascondere i metodi di JFrame che lo rendono più difficile da mantenere e più facile da attivare bug inattesi quando usi la classe .

In genere, l'intenzione è strettamente quella di utilizzare la classe per disegnare una cornice e la composizione è preferibile rispetto all'ereditarietà.

Detto questo, la sottoclasse dovrebbe andare bene quando si intende che la sottoclasse aggiunga funzionalità specifiche del progetto al Frame (come i metodi di convenienza e simili) dove la sottoclasse verrebbe usata al posto del Frame stesso, ma usata come un frame in generale, non come una vista di un frame specifico nell'applicazione.

4

Se l'applicazione REALMENTE è solo una JFrame, andare avanti ed estenderla. Tuttavia, è preferibile utilizzare la composizione di un oggetto piuttosto che l'ereditarietà se si è semplicemente utilizzando un JFrame.

Se il tuo oggetto estende qualche altro oggetto non avresti alcuna scelta in merito, ad esempio.

+1

Concordato. Questo è swing, devi estendere i componenti per ottenere il comportamento della vernice. – akarnokd

+1

@ kd304 * "per ottenere il comportamento della vernice." * È possibile eseguire il "comportamento del colore" in una 'BufferedImage' .. –

2

Non vedo il problema finché si estende la classe e si possono preservare gli aspetti "dell'is-a" dell'ereditarietà.

Quando estendi un JPanel ma il tuo nuovo oggetto non è una vera specializzazione di JPanel, è lì che ti trovi nei guai. Ma se si crea un nuovo SpeciallyFormattedJLabel che si estende JLabel, non vedo alcun problema.

9

Preferire la composizione all'ereditarietà. Tutte le solite ragioni. La composizione impone meno dipendenze tra codice.

Swing e evento AWT, i componenti sono orribilmente complicati. Non vuoi entrare in quel casino. Puoi facilmente ignorare i metodi accidentalmente. Nei casi in cui è necessario sovrascrivere i metodi, è difficile vedere dove viene eseguito se si trova nel codice normale.

+4

isValid è un classico per sovrascrivere accidentalmente – willcodejavaforfood

0

So che questo è un vecchio post, ma l'ho appena incontrato e devo dirvi ... estendendo le mie opzioni limitate di chiamare certe azioni dell'oggetto. In realtà sto riscrivendo alcune parti del codice ora per sbarazzarmi del danno che mi ha causato. A meno che non stia scrivendo un programma a un solo file, non lo userò di nuovo esteso.