What are the key principles of object-oriented programming?
Demonstrate the principles by implementing shape classes that calculate area through a shared abstract interface. Define calculate_total_area(shapes), accepting a list of shape dictionaries and returning the total area rounded to two decimal places.
Input dictionaries use {"type": "rectangle", "width": number, "height": number} or {"type": "circle", "radius": number}. The implementation should use encapsulated state, inheritance, abstraction, and polymorphic method calls.
def calculate_total_area(shapes):