2010-07-27 14 views
33

Ho alcune domande di base su classi/metodi astratti. So che l'uso di base delle classi astratte è quello di creare modelli per classi future. Ma ci sono altri usi di loro? Quando dovresti preferirli alle interfacce e quando no? Anche quando sono utili i metodi astratti?Quando e perché utilizzare classi/metodi astratti?

+0

possibile duplicato del [Interface vs Classe base] (http://stackoverflow.com/questions/56867/interface-vs-base-class) - e ci sono molti ** ** più con risposte di altissima qualità: basta cercare su "Interfaccia classe astratta". –

risposta

46

So uso di base di classi astratte è quello di creare modelli per le future classi. Ma ci sono altri usi di loro?

Non solo è possibile definire un modello per i bambini, ma le classi astratte offrono il vantaggio aggiuntivo di consentire di definire le funzionalità che le classi figlio possono utilizzare in un secondo momento.

Non è possibile fornire un'implementazione per un'interfaccia.

Quando si preferiscono le interfacce e quando no?

Le classi astratte sono una buona soluzione se si desidera fornire dettagli di implementazione ai propri figli ma non si desidera consentire l'istanziazione diretta di un'istanza della classe (che consente di definire parzialmente una classe).

Se si desidera semplicemente definire un contratto per gli oggetti da seguire, quindi utilizzare un'interfaccia.

Anche quando sono utili i metodi astratti?

I metodi astratti sono utili allo stesso modo in cui è utile definire i metodi in un'interfaccia. È un modo per il progettista della classe Abstract per dire "qualsiasi bambino mio DEVE implementare questo metodo".

+1

"Non è possibile fornire un'implementazione per un'interfaccia." È possibile utilizzare Java 8 con un metodo predefinito. –

2

Ad un livello molto alto:

astrazione di qualsiasi tipo si riduce a preoccupazioni di separazione. Il codice "Cliente" di un'astrazione non interessa come viene soddisfatto il contratto esposto dall'astrazione. Di solito non ti interessa se una classe di stringhe usa un'implementazione di archiviazione interna con terminazione null o di lunghezza del buffer, ad esempio. L'incapsulamento nasconde i dettagli, ma creando classi/metodi/ecc. astratto, si consente di modificare l'implementazione o di aggiungere nuove implementazioni senza influire sul codice client.

4

leggere il seguente articolo http://mycodelines.wordpress.com/2009/09/01/in-which-scenario-we-use-abstract-classes-and-interfaces/

classi astratte

-> Quando si dispone di un requisito di cui vostra classe di base dovrebbe fornire di default attuazione di alcuni metodi mentre altri metodi dovrebbero essere aperti per essere sovrascritto dalle classi figlio utilizzare classi astratte.

Ad es. riprendi l'esempio della classe di veicoli sopra. Se vogliamo che tutte le classi derivino da veicolo a implementare il metodo Drive() in un modo fisso mentre gli altri metodi possono essere sovrascritti da classi figlio.In tale scenario implementiamo la classe veicolo come una classe astratta con un'implementazione di unità, mentre lasciare gli altri metodi/proprietà come astratte in modo che potessero essere prevalga classi figlie.

-> Lo scopo di una classe astratta è di fornire una definizione comune di una classe base che multipla derivato classi possono condividere.

Ad esempio una libreria di classi può definire una classe astratta che viene utilizzato come parametro a molte delle sue funzioni e richiedono programmatori utilizzando tale libreria fornire loro attuazione classe creando una classe derivata.

Usa una classe astratta

Quando si crea una libreria di classi che verrà ampiamente distribuito o riutilizzato, specialmente ai clienti, utilizzare una classe astratta a preferenza di un'interfaccia ; perché semplifica il controllo delle versioni di . Questa è la pratica utilizzata da dal team Microsoft che ha sviluppato la libreria di classi base. (COM era progettato attorno alle interfacce.) Utilizzare una classe astratta per definire una classe comune per una famiglia di tipi. Utilizzare una classe astratta per fornire il comportamento predefinito . Sottoclasse solo una classe base in una gerarchia a cui la classe appartiene logicamente.

1

In genere si utilizza una classe astratta per fornire alcune funzionalità incomplete che verranno arricchite da sottoclassi concrete. Può fornire metodi utilizzati dalle sue sottoclassi; può anche rappresentare un nodo intermedio nella gerarchia di classi, per rappresentare un raggruppamento comune di sottoclassi concrete, distinguendole in qualche modo da altre sottoclassi della sua superclasse. Poiché un'interfaccia non può derivare da una classe, questa è un'altra situazione in cui una classe (astratta o altrimenti) sarebbe necessaria, rispetto a un'interfaccia.

Una buona regola empirica è che solo i nodi foglia di una gerarchia di classi dovrebbero essere istanziati. Rendere astratti i nodi non fogliari è un modo semplice per garantirlo.

1

Classi/metodi astratti vengono generalmente utilizzati quando una classe fornisce alcune funzionalità di alto livello ma lascia fuori determinati dettagli da implementare per classi derivate. Rendere l'abstract della classe/metodo assicura che non possa essere usato da solo, ma deve essere specializzato per definire i dettagli che sono stati lasciati fuori dall'implementazione di alto livello.Questo è più spesso utilizzato con il modello Template Method:

http://en.wikipedia.org/wiki/Template_method_pattern

Problemi correlati