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.
Ha! forse potremmo combinare tutte le nostre anser simultanee e condividere il rappresentante. ;-) –
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