O conceito de classe abstrata se situa entre o conceito de classe e o de interface. É uma classe que não se pode instanciar, pois determinados métodos não são implementados.
Uma classe abstrata pode conter atributos, métodos implementados e assinaturas de métodos a implementar. Uma classe pode implementar totalmente ou parcialmente uma interface e pode herdar de uma classe ou de uma classe abstrata.
Se retornarmos ao nosso exemplo, podemos ver que Forma é um conceito genérico. Não desejamos criar uma forma, e sim figuras que contenham características gerais de uma forma, mas com formatos específicos como quadrados, círculos e retângulos. Assim não teria sentido ter um objeto do tipo Forma, não é mesmo? Entretanto, algumas características de uma forma são compartilhadas por todas as figuras como origem, então temos aqui uma necessidade de herdar atributos, uma flexibilidade que a interface não possui.
A palavra abstract é utilizada antes da palavra-chave class para declarar uma classe abstrata, bem como para declarar as assinaturas de métodos a implementar.