What are the differences between abstract classes and interfaces, and when would you use each in a large-scale data pipeline?