Classes abstratas e interfaces
A Programação Orientada a Objetos nasceu da necessidade de organização dos códigos-fonte das aplicações. Muitas pessoas se assustam com a POO, acredito que é devido o nível de abstração, porém é a mesma linguagem mas com o código organizado, tudo depende de disciplina.
Provavelmente o que confunde a cabeça de muita gente, na hora de programar em POO, são as classes abstratas e as interfaces. O conceito delas é muito simples: organização, principalmente definir padrões.
Em uma classe abstrata você pode declarar atributos e métodos que serão usados em uma classe final ou um grupo de classes final, nunca é uma outra classe abstrata ou interface. Na pratica isso ajuda a não repetir código, e se precisar alterar algo não será preciso ir em cada classe modificando a mesma coisa. Aplicações tipo ADO utilizam desse recurso para padronizar a comunicação com bancos de dados diferentes.
A interface só virtualizará métodos, e obrigatoriamente terão que declará-los na classe em que for implementada. A função da interface não difere da classe abstrata, porém a interface tem uma estrutura mais limpa que pode deixar sua aplicação mais leve.
O uso de interfaces e classes abstratas não é mandatório, porém se você tem um grupo de desenvolvimento é interessante que se crie certas abstrações para que sua aplicação fique bem estruturada e modulada. A modularização da aplicação também ajuda no trabalho do grupo separando-o por área de especialidade.