Say you have a paint program that can draw different shapes: circles, rectangles, lines, polygons, etc. You might have code like: foreach (shape in listOfShapes) { if (shape.type == RECT) graphics.drawRect(shape); else if (shape.type == CIRC) graphics.drawCirc(shape); else if (shape.type == LINE) graphics.drawLine(shape); else if (shape.type == POLY) graphics.drawPoly(shape); } Not only is this code ugly, it's hard to maintain because we have to add another "else if" any time we add a new type of shape. It also doesn't appeal to our sense of laziness. Polymorphism is basically the programmer saying: "Shape, just draw yourself the right way, okay?", a la: foreach (shape in listOfShapes) shape.draw(graphics); Much nicer. This of course, hides the detail of drawing and makes the code easier to maintain. (A depiction of the 'Shapes' class hierarchy is left as an exercise for the reader.) You could add similar methods so that performing operations on the list of shapes never requires you to write multiway 'if' statements to test it every time. FrEx: similar code could be written to save the shapes to a file, a la: foreach (shape in listOfShapes) shape.save(file); Moral to the story: Whenever you see a multiway 'if' stmt that tests for a 'type' and does different things based on the type, "polymorphism" should leap to mind.