Safari Books Online is a digital library providing on-demand subscription access to thousands of learning resources.
The type system enables you to refer to an object by its own class, by any of its superclasses, by any interface it implements, or by a combination of these. All these potential types for an object are valid because, by being more specific, it must implement a superset of all the more general types' functionality. A Square is still a Rectangle because it is a specific kind of Rectangle, and it is a Shape because it is a specific kind of Shape. It might also be an IPointCollection if it can provide a set of points that comprise its vertices. The point is that these aren't conversions: the class really is all the things that it extends.
Because you can refer to a class by many names, you need ways to get between these types. You should be able to test at runtime if an object is an instance of a given class or implements a particular interface. You should be able to convert a specific type to a general type, and you should be able to attempt to convert general types to specific types. You should even be allowed to attempt to convert types to unrelated types.