Данный код не нарушает принцип Барбары Лисков, так как при использовании upcast логика работы не будет нарушена, дочерние классы содержат в себе только те методы, что и интерфейс, который они реализуют, тоже самое справедливо и для абстрактных классов.