CollectionProperty with inherited types
This is not possible in Blender. Blender's API is build on defining exactly what type is in a collection. It is not possible to add other types (even if they are subtypes) to that collection.

The reason for this that blender does not store the type of the item with the item. It always uses the class that has been given by the type parameter of the CollectionProperty as the class. If your addon will rename your class Blender will still be able to fill the list as it is defined by the CollectionProperty.

Best way to solve this is to do the reverse and add use a 'type' enum to your PropertyComponent. I assume that your type was already created for this.

class Property_Component_Water(object):
    wave_height = bpy.props.StringProperty(...)
    color = bpy.props.FloatProperty(...)

class Property_Component_Terrain(object):
    max_height = bpy.props.FloatProperty(...)


class Property_Component(bpy.types.PropertyGroup, Property_Component_Water, Property_Component_Terrain):
    type = bpy.props.EnumProperty(items=component_types_array)

class Property_ComponentList(bpy.types.PropertyGroup):
    components = bpy.props.CollectionProperty(type=Property_Component)


Note: You need to be aware of not redefining attributes with the same name multiple times.