2013-03-02 16 views
36

Supponiamo di avere due metodi M1() e M2() in un'interfaccia. Anche una classe astratta ha gli stessi due metodi astratti. Se qualche classe ha implementato questa interfaccia o ereditata dalla classe astratta, dovrà implementare entrambi i metodi in essa contenuti.Qual è la differenza tra una classe astratta e un'interfaccia?

Quindi per me, sembra che un'interfaccia o una classe astratta si comportino allo stesso modo per il mio scenario. Quindi, qualcuno può evidenziare la differenza tra questi due in questo caso specifico e suggerire se utilizzare una classe astratta o un'interfaccia qui?

+0

Ha! forse potremmo combinare tutte le nostre anser simultanee e condividere il rappresentante. ;-) –

+0

Mate e llya puoi per favore elaborare i tuoi pensieri? Supponiamo che io abbia un'interfaccia IMath che contenga due metodi AddNumbers() e ConcatenateStrings(). Questi due come metodi astratti sono anche in una classe matematica astratta. Ora puoi suggerire per favore dovrei usare IMath o Math? – WpfBee

risposta

90

Esistono differenze tecniche tra classi astratte e interfacce, che essendo una classe astratta può contenere l'implementazione di metodi, campi, costruttori e così via, mentre un'interfaccia contiene solo prototipi di metodi e proprietà. Una classe può implementare più interfacce, ma può ereditare solo una classe (astratta o meno).

Tuttavia, a mio avviso, la differenza più importante tra le interfacce e le classi astratte è la differenza semantica.

Un'interfaccia definisce cosa può fare (come si comporta) e una classe astratta definisce cosa è una cosa.

Prendiamo ad esempio IEnumerable, il significato semantico dietro questo è che tutto ciò che implementa IEnumerable è enumable, non significa che è un'enumerazione, ma che può comportarsi come uno (può essere enumerato).

Contrariamente che con lo washing machine example, tutto ciò che lo eredita è un tipo di lavatrice. Tutto ciò che lo eredita sarebbe un tipo di lavatrice, un caricatore superiore o un caricatore laterale, ecc.

Invece, se si dispone di un'interfaccia chiamata ICanWash, che potrebbe contenere un metodo chiamato Wash. Potresti avere varie cose che implementano lo ICanWash, sia esso un Person, una classe astratta di lavabiancheria, ecc., Dove l'effettiva implementazione non ha importanza, devi solo sapere che il comportamento è che può lavare le cose.

In sintesi, le classi definiscono cosa è qualcosa, le interfacce definiscono ciò che qualcosa può fare.

+1

Questo è quello che stavo cercando. Ottimo punto, dato che quello che è OOP è tutto ciò che penso. – marsze

1

L'interfaccia consente a una classe di ereditare/implementare più di un'interfaccia, mentre in C# è possibile ereditare solo da una classe.

Ereditarietà multipla, in pratica.

+1

Quindi, per me, da questa discussione finale: 1. Un'interfaccia definisce cosa può fare qualcosa (come si comporta), e una classe astratta definisce cosa è qualcosa. 2. Se possibile, utilizzare le interfacce e non le classi astratte. Motivo: se hai una classe che ha già implementato alcune interfacce e eredita una classe. Quindi, in questo caso questa classe non sarà in grado di ereditare la tua classe astratta in quanto l'ereditarietà multipla è limitata. Ma se vuole implementare l'interfaccia, non ci sono problemi. – WpfBee

+1

Abbastanza corretto, ma se si implementa un'interfaccia (in una dichiarazione di classe), è necessario codificarla, non c'è scelta. Basta chiarire che per ogni evenienza. – CharlesW

1

La classe astratta non solo contiene metodi astratti, ma può anche contenere altri campi e metodi con l'implementazione. In C# non puoi ereditare da classi multiple, ma puoi implementare interfacce multiple. Quindi la risposta breve è: quando possibile usa le interfacce e non le classi astratte. Nel tuo esempio è possibile, e quindi raccomandato, utilizzare un'interfaccia.

+0

Sì, ha senso. – WpfBee

1

due pensieri veloci sulle differenze tra le interfacce e classi astratte:

  1. classi astratte desiderato, se l'espansione futura è probabile, come una classe astratta può essere ampliato, ma l'interfaccia dovrebbe essere migliorata con l'aggiunta di un'altra interfaccia, I2.
  2. L'ereditarietà singola (implementazione) sceglie le classi astratte careully, per riflettere più da vicino la vera natura di base. Le interfacce possono essere facilmente aggiunte a un'implementazione, ma una classe astratta può essere aggiunta a solo se non ce n'è già una.
3

Da MSDN:

Utilizzando interfacce, è possibile, ad esempio, comprendere il comportamento da più fonti in una classe. Questa capacità è importante in C# perché la lingua non supporta l'ereditarietà multipla di classi

Quindi, l'interfaccia usare se si vuole che ogni classe può ereditare che i metodi.

Dalla stessa pagina MSDN:

Inoltre, è necessario utilizzare un'interfaccia se si desidera simulare eredità per le strutture, perché non possono in realtà ereditare da un'altra struct o classe.

+0

Supponiamo che al momento non esista un chiaro requisito in merito all'eredità e quale preferire? – WpfBee

+1

Altri esempi: se vuoi creare metodi/proprietà che altre classi possono implementare, usa l'interfaccia. Ma ricorda quando aggiungi/rimuovi i metodi nell'interfaccia, quindi devi fare lo stesso in tutte le classi che implementano quello. Nelle classi astratte è possibile aggiungere/rimuovere metodi e questo ha effetto su tutte le classi che ereditano una classe astratta – Fabio

Problemi correlati