La idea de SOLID es que crees una estructura de clases que sea mantenible en el tiempo y extensible en el tiempo.
S <– toda clase debería tener una sola responsabilidad
O <– toda entidad debería estar abierta a la extensión pero cerrada a la modificación. Cuando extendés la funcionalidad implica que lo que ya hacías se sigue manteniendo, pero le agregas comportamiento, no le quitas comportamiento ni le modificas comportamiento
L <– Principio de sustitución de Liskov (acá me aclaró mucho el comentario de Lucas), Las clases hijas deben poder sustituir a su clase padre. Es decir si alguien esta usando a tu clase padre, en vez de una instancia de tu clase padre te pasan a vos, vos deberías poder cumplir con las tareas que hace tu clase padre (por algo heredas de esa clase). Esto te permite pensar siempre que haces herencia, la herencia sea coherente.
I <– Segregación de interfaces, siempre interponer interfaces especificas a cada cliente tuyo en vez de una general para todo el mundo así evitas que todos implementen métodos innecesarios y no aplicables a todo el mundo.
D <– Inversión de dependencias (acá también iluminó Lucas). Básicamente lo que dice es que cuando tenes objetos que dependen de vos, no dependan directamente de vos, sino que entre ambos haya una interfaz siempre, de esa manera, el objeto dependiente de vos se puede cambiar por otro sin afectarte como clase (total ambos deben respetar la interfaz)