2010-02-17 5 views

risposta

15

Il soggetto di questo post e il corpo porre due domande diverse:

  1. Dovrebbe avere almeno un membro astratto?
  2. È necessario disporre di almeno un membro astratto?

La risposta alla 2 # è definitivamente no.

La risposta al numero 1 è soggettiva e una questione di stile. Personalmente direi di si. Se il tuo intento è quello di impedire l'istanziazione di una classe (senza metodi astratti), il modo migliore per gestirlo è con un costruttore , non contrassegnandolo con abstract.

+0

Potrebbero esserci motivi concettuali per cui potresti volere una classe astratta che non abbia metodi astratti in essa ... – thecoop

+0

Qualche esempio di uno di questi scenari in cui non hai bisogno di un metodo astratto in una classe astratta? –

+0

@sai praveen, MouseAdapter è un esempio (se un po 'specifico e altamente specifico per la lingua). – Yishai

6

No, è possibile dichiarare un estratto di classe senza avere metodi astratti. Potrebbe non avere alcun senso concettualmente per un'istanza di quella classe esistere, o potreste voler assicurare che solo sottoclassi di quella classe possano essere istanziate (per qualsiasi ragione)

+3

+1 Questa risposta è la più "al punto" e la risposta concisa qui. Grazie! – AndHeCodedIt

14

No, non è necessario. Vedete questo spesso indietro nel "template method" modello di progettazione, come HttpServlet, in cui ogni metodo ha già definied comportamento predefinito e sei libero di ignorare solo uno (o più) di loro invece di tutte di loro.

+0

+1 perché questo è un buon punto almeno occasionalmente, anche se trovo un po 'strano che qualsiasi classe di modello di metodo template possa avere un predefinito corretto per ogni cosa. – dsimcha

+0

In caso di 'HttpServlet' è utile, definies per restituire l'errore HTTP 503" Metodo non consentito "in nessuno dei metodi predefiniti' doXXX() ', completamente secondo le specifiche HTTP. – BalusC

9

In JDK 1.0 era infatti necessario avere almeno un metodo astratto in una classe astratta. Questa restrizione è stata rimossa in JDK 1.1 (1997? (I'm old)) e tali classi aggiunte alla libreria Java, come ad esempio java.awt.event.KeyAdapter.

In C++ è necessario almeno una funzione virtuale pura di fare una sottoclasse necessaria, ed almeno una funzione virtuale per aggiungere RTTI alla classe. In genere ha senso usare il distruttore.

Nota quando sovrascrivendo i metodi non astratti, utilizzando @Override è una buona idea. Non solo indica al lettore informazioni importanti su ciò che il codice sta tentando di fare, ma individua anche errori comuni in cui errori di battitura o tipi di parametri errati impediscono l'override.

+2

+1 per la lezione di storia. :) –

-1

Se una classe ha un modificatore abstract nella dichiarazione, diventa abstract classe.

+2

È perfettamente sintatticamente valido definire una classe come astratta quando non ha metodi astratti. Non sto facendo downvoting, ma questa risposta è in realtà errata. Si noti che la lingua per la domanda è Java, non C++. – CPerkins

+0

@CPerkins - Sto dicendo questo dicendo "Non il contrario". – fastcodejava

+0

E hai ancora torto. Se una classe ha il modificatore 'astratto' è astratta per definizione, se ha metodi astratti o meno. – EJP