Cuando creamos interfaces, debemos definir todos los métodos que coloquemos dentro como métodos públicos, pero no se pueden utilizar métodos protegidos, por lo que para estos casos no vamos a poder utilizar interfaces. Para ello nos van a ayudar lo que se denominan clases abstractas. Se comportan de una manera similar a las interfaces pero permiten definir los métodos como protegidos o permiten poder extendernos en la funcionalidad de algún método.
La clase abstracta se crea de igual manera que las clases, sólo que anteponiendo la palabra reservada abstract delante de la palabra class. Igualmente, a todos los métodos que incluyamos les tenemos que anteponer la palabra reservada abstract.
Cuando definimos una clase abstracta, no podemos instanciar esta clase, las clases abstractas sólo sirven para que pueda ser extendida desde otra clase.
Ejm
Interfaz VS clase abstracta
La interfaz sólo permite dejar pautas de qué métodos deben llevar las clases que la implementen, pero no pueden desarrollar ninguno de los métodos, mientras que las clases abstractas sí pueden desarrollar los métodos. Cuando trabajamos con interfaces sólo podemos definir métodos públicos mientras que con las clases abstractas podemos definir tanto métodos públicos como protegidos.