Quais são algumas das principais diferenças de uma classe e uma interface em c #?

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:

  • Comportamento compartilhado. Uma interface / classe / estrutura pode implementar (ou herdar) várias interfaces.
  • Os princípios de programação (D do SOLID, princípio de inversão de dependência) afirmam que as entidades devem depender de abstrações.

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:

  • Uma classe pode implementar métodos / propriedades, uma interface não. Ambos podem "defini-los" embora.
  • Uma interface não pode herdar de uma classe, enquanto uma classe pode.
  • Uma interface não pode ter construtores. As aulas podem.
  • Uma interface não pode ter campos, uma classe pode.
  • Uma interface não pode ter nenhum membro estático, uma classe pode.
  • As interfaces só podem usar os modificadores de acesso e o modificador "parcial", enquanto as classes podem usar outros modificadores (por exemplo, resumo, lacrado).
  • As interfaces não podem substituir os métodos / propriedades herdados, pois não podem "implementar". As aulas podem.
  • As interfaces não podem ser instanciadas, as classes concretas podem (aquelas que não são abstratas).
  • As classes podem conter métodos virtuais, as interfaces não. Métodos abstratos em classes abstratas são a mesma coisa com métodos de interface.