Hola.... feliz año!!!
Veo que esto toma bastante forma. Por mi parte hago otro par de aportaciones:
Por un lado, la diferencia entre utilizar una interfaz y una clase abstracta es que la interfaz no incluye absolutamente nada de código, mientras que una clase abstracta sí... De hecho, se podría decir que una interfaz es una clase abstracta en la que todos sus métodos son abstractos.
En muchas ocasiones pueden ser intercambiados y eso resulta útil sobre todo en lenguajes que no soportan herencias múltiples como es el caso de PHP (que a mi forma de ver es como debería ser... pero eso es otra discusión).
En fin... filosóficamente hablando
deberías implementar algo como interfaz si distintos tipos de objeto que no necesariamente deben estar en el mismo "árbol genealógico" deben implementar unas funcionalidades. Si por el contrario todas las clases que deben implementar la funcionalidad (lease métodos y propiedades) deben ser familia y no deben heredar de más nadie, entonces una clase abstracta te sirve.
Con respecto a implementar varias clases para cada tipo de campo, estoy de acuerdo con GatorV. Porque esto te permite añadir funcionalidades especiales por cada tipo de validación sin tener que hacer una sola clase con un gran switch-case.