A principal diferença para entender são os diferentes propósitos; qualquer outra diferença faz mais sentido.
Uma classe é onde o comportamento vai; é "onde as coisas acontecem". Uma interface não tem comportamento; está lá para definir qual comportamento deve ser implementado ('o contrato').
Portanto, você não pode instanciar uma interface (não faz sentido tentar instanciar uma, pois ela não contém comportamento), mas você pode instanciar uma classe (para tirar vantagem do comportamento que ela contém)
No C #, foi tomada uma decisão muito sábia para proibir a herança múltipla das classes. Isso ocorre porque, como as classes contêm comportamento, a herança múltipla abre algumas situações muito complicadas que podem levar a erros sutis e feios. Por outro lado, uma classe pode implementar (herdar) quantas interfaces o designer desejar, uma vez que elas não contêm nenhum comportamento que levaria a essas situações complicadas.
E, obviamente (com base na descrição acima), você não pode colocar comportamento em uma interface, enquanto você pode e coloca comportamento em uma classe. Assim, um elemento de interface se pareceria
void DoSomething ();
enquanto um método de classe seria semelhante
void DoSomething () {
…
}
Felicidades!
Interfaces são contratos, projetos, esquemas. Classes são implementações, exceto abstratas. Existem duas razões principais para o uso da interface da minha perspectiva:
Classes abstratas também são abstrações, mas classes abstratas e interfaces, especialmente em C #, servem a propósitos distintos.
As diferenças em um ponto de vista técnico são: