What's the difference between a generic class and vertex or edge classes? Why would you use one over the other?