2009-02-17 6 views
14

Duplicate: Interface vs Base classCome si decide tra l'uso di una classe astratta e un'interfaccia?


Sono stato sempre più in profondità nel mondo della programmazione orientata agli oggetti, modelli di progettazione, e ActionScript 3 e sono ancora curioso come sapere quando utilizzare una classe astratta (pseudo per AS3 che non supporta le classi astratte) e un'interfaccia. Per me entrambi servono solo come modelli che assicurano che determinati metodi siano implementati in una determinata classe. La differenza è solo nel fatto che le classi Abstract richiedono ereditarietà e un'interfaccia si estende semplicemente?

Grazie, Brian Hodge hodgedev.com

+0

dupe: http://stackoverflow.com/questions/56867/interface-vs-base-class – juan

+1

è leggermente diverso perché si riferisce alle classi di base astratte, piuttosto che a tutte le classi di base. –

+0

Vorrei rimuovere il collegamento duplicato, ma non ho quel livello di accesso –

risposta

30

Utilizzare una classe astratta se si dispone di alcune funzionalità che si desidera è di avere sottoclassi. Ad esempio, se hai una serie di funzioni che vuoi che abbiano tutte le sottoclassi della classe astratta base.

Utilizzare un'interfaccia se si desidera un contratto generale su comportamento/funzionalità. Se hai una funzione o un oggetto che vuoi utilizzare in una serie di oggetti diversi, usa un'interfaccia. Quindi puoi cambiare l'oggetto che è passato, senza cambiare il metodo o l'oggetto che lo sta prendendo.

Le interfacce sono in genere lente rispetto alle classi astratte. Non si vorrebbe utilizzare le interfacce in una situazione in cui si scrive costantemente lo stesso codice per tutti i metodi dell'interfaccia. Usa una classe astratta e definisci ciascun metodo una volta.

Inoltre, se si sta tentando di creare una gerarchia di ereditarietà di oggetto specifica, non si vorrebbe provare a farlo solo con le interfacce.

Inoltre, in alcune lingue è possibile avere una sola classe base, e se un oggetto ha già una classe base, si dovrà eseguire un refactoring per utilizzare una classe base astratta. Ciò potrebbe significare che potresti voler utilizzare un inteface.

Come nota @tvanfosson, non è una cattiva idea utilizzare molte interfacce, quando si capiscono veramente le classi e le interfacce astratte, non è realmente una o/o situazione. Una situazione particolare potrebbe utilizzare sia classi astratte che interfacce o nessuno dei due. Mi piace usare le interfacce a volte semplicemente per limitare ciò che un metodo o un oggetto possono accedere su un oggetto parametro passato.

+0

Grazie mille questo è stato molto utile. –

+0

Questo è dritto al punto, i pollici in su da me – JPReddy

2

Le classi astratte offrono la possibilità di implementare metodi specifici e richiedono l'implementazione di altri nella classe ereditaria. Con le interfacce, tutto deve essere implementato nella classe di implementazione.

2

Come le note di @ m4bwav, la differenza principale è che una classe astratta può, e spesso lo fa, fornire un'implementazione predefinita per almeno alcuni metodi. Questo ti permette di usare la classe astratta per mantenere il tuo codice DRY (non ripeterti), mantenendo il codice comune a tutte le classi che ereditano dalla classe astratta nella classe astratta stessa.

Penso che sia un falso dilemma, però. Non è necessario e probabilmente non dovrebbe scegliere tra interfacce e classi astratte. Nella maggior parte dei casi, si vorrebbe definire l'interfaccia, quindi fare in modo che la classe astratta fornisca un'implementazione di scheletro predefinita se richiesta/desiderata. Per me la domanda sarebbe: ho bisogno di un'interfaccia o un'interfaccia e una classe astratta piuttosto che un'interfaccia o una classe astratta. Usando l'interfaccia si disaccoppia il codice da qualsiasi implementazione particolare, anche la tua implementazione astratta della classe.Se dovessi scegliere di avere un'implementazione alternativa, l'utilizzo dell'interfaccia consentirebbe questo, mentre se avessi solo la classe astratta, dovresti rifattorizzare per aggiungere l'interfaccia in un secondo momento.

L'unica situazione in cui posso vedere che fornire un'interfaccia in tale situazione non sarebbe auspicabile è dove si desidera che si limiti a in modo che sia possibile utilizzare solo l'implementazione. L'uso della classe astratta e l'uso di determinati metodi non sono virtuali, ma impongono l'uso del codice in tutte le circostanze in cui l'implementatore deriva dalla classe.

Problemi correlati