Se você parar para pensar sobre isso, verá que uma interface não é semanticamente muito diferente de uma classe abstrata:
- Ambos possuem métodos e / ou propriedades (comportamento);
- Nenhum dos campos deve ser privado (dados);
- Nenhum dos dois pode ser instanciado diretamente;
- Derivar de um significa implementar quaisquer métodos abstratos que ele tenha, a menos que o tipo derivado também seja abstrato.
Na verdade, as distinções mais importantes entre classes e interfaces são:
- As interfaces não podem ter dados privados;
- Os membros da interface não podem ter modificadores de acesso (todos os membros são "públicos");
- Uma classe pode implementar várias interfaces (em oposição a geralmente poder herdar de apenas uma classe base).
Como as únicas distinções particularmente significativas entre classes e interfaces giram em torno de (a) dados privados e (b) tipo hierarquia - nenhum dos quais faz a menor diferença para um chamador - geralmente não é necessário saber se um tipo é uma interface ou uma classe. Você certamente não precisa da indicação visual .
No entanto, existem alguns casos importantes em que você deve estar ciente. Em particular, se você estiver usando reflexão, interceptação, proxies dinâmicos / mixins, tecelagem de bytecode, geração de código ou qualquer coisa que envolva o messing diretamente com o sistema de digitação do ambiente ou o próprio código - então é muito útil e às vezes é necessário saber logo de cara se você está lidando com uma interface ou uma classe. Você claramente não quer que seu código falhe misteriosamente porque você tentou adicionar uma classe, em vez de uma interface, como um mixin.
No entanto, para um código de lógica de negócios típico, típico, de baunilha, as distinções entre as classes abstratas e as interfaces não precisam ser anunciadas, porque nunca entrarão em ação.
Dito isto, prefiro prefixo minhas interfaces C # com I
, porque essa é a convenção .NET usada e defendida pela Microsoft. E quando estou explicando as convenções de codificação para um novo desenvolvedor, é muito menos complicado usar as regras da Microsoft do que explicar por que temos nossas próprias regras "especiais".