2012-02-11 16 views
8

Ci sono due modi per scegliere tra classe astratta o interfaccia. soluzione di Microsoft e la soluzione Oracle:Classe astratta o interfaccia. Qual è il modo corretto?


Microsoft, disegno linea guida:

utilizzati astratta (MustInherit in Visual Basic) classi invece di interfacce per disaccoppiare il contratto da implementazioni.

http://msdn.microsoft.com/en-us/library/ms229013.aspx


Oracle, i tutorial Java:

Se una classe astratta contiene solo dichiarazioni di metodo astratto, dovrebbe essere dichiarata come interfaccia, invece.

http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html


La mia domanda è: in che modo è corretto? Soluzione Microsoft o Oracle? Nota che penso che scegliere tra classe astratta o interfaccia non dipenda dal linguaggio di programmazione (Java o C#).

risposta

10

Se ricordo il mio blog che legge correttamente, il consiglio di Microsoft di utilizzare classi astratte deriva dalla possibilità di riutilizzare l'implementazione con una classe astratta, qualcosa che non si può fare con un'interfaccia.

Si noti inoltre che la pagina Microsoft a cui si è collegati è specificamente una guida per la scrittura di librerie di codici per la condivisione/riutilizzo su più progetti. La probabilità in questa situazione è che tu stesso stia scrivendo tutte le implementazioni dell'interfaccia, probabilmente all'interno dello stesso assembly. Le buone pratiche per lavorare su un singolo prodotto o sistema varieranno in qualche modo.

Un approccio comune che ho visto in un certo numero di basi di codice in un certo numero di lingue è questo:

  • Definire un'interfaccia per specificare il contratto
  • Creare una classe astratta attuazione del contratto di prestazione qualsiasi implementazione comuni utili a tutti i discendenti
  • implementazioni del contratto quindi hanno la possibilità di partire dalla classe base per convenienza, o semplicemente per implementare l'interfaccia, se vogliono il controllo completo

Un quarto passo comune nel mondo .NET è quello di fornire funzioni di estensione della convenienza create sull'interfaccia.

+0

+1 "Le buone pratiche per lavorare su un singolo prodotto o sistema possono variare leggermente" –

1

Un'interfaccia non porta implementazione - è un contratto. Permette il disaccoppiamento completo.

Passerò da un'interfaccia a una classe astratta (base) se desidero fornire un'implementazione comune mentre imposto sulla classe concreta della classe ereditaria di fornire alcune implementazioni specifiche per quella classe. Questo fornisce un po 'meno disaccoppiamento.

anche essere consapevoli che molti linguaggi come C# (e linguaggi .NET come VB.net ecc ...), così come Java non consentono l'ereditarietà multipla in modo interfacce diventano un modo per consentire una classe di avere molti comportamenti.

7

Sono 2 dichiarazioni per diversi contesti.

La linea guida Microsoft da cui si cita è per "Progettazione di librerie di classi". E afferma la ragione per favorire le classi astratte lì: è possibile aggiungere funzionalità senza rompere nulla.

Per la separazione e il disaccoppiamento su livelli e altri limiti, Microsoft consiglia anche le interfacce.

+0

+1 - Chiaro chiarimento ... – bryanmac

+0

+1 - questo indica il motivo principale per la raccomandazione Microsoft. – Joe

Problemi correlati