refactored Surface to be an abstract class
implemented polygons in terms of seperate TriangleSurfaces