当你继承了一个类时,你也创建了一个新的类。这个新的类不仅包含了已有类的所有成员(尽管private成员已经隐藏起来了,是不能访问的),更重要的是它复制了基类的接口。于是所有能够传给基类的消息也都可以传给派生类。由于我们根据它能接受什么消息来判断这是什么类,因此这就意味着派生类和基类是属于同一类型的。
既然基类和派生类具有相同的基本接口,那么这个接口的背后就必须跟着实现。也就是当对象收到某个消息的时候,它必须能执行一些代码。如果你只是继承了一个类,其他什么都不做,那么基类的方法会直接带进派生类,也就是说派生类的对象与基类的对象的类型相同而且行为也一样,这可就没有什么吸引力了。
有两种方法来区分新的派生出来的类和那个原来的基类。第一种方法很简单:直接往派生类里加新的方法。这些新的方法不属于基类的接口。也就是说由于基类不能完成所有的工作,你必须加上更多方法。这种简单原始的继承方法常常是解决问题的完美方案。然而你还得仔细看看基类是不是也需要这些方法。对于OOP的设计,这种反复发现的过程是很常见的。尽管有些时候继承会隐含你准备往接口里加进一些新的方法,但这并不是必须的。第二个,也是更重要的区分方法是在新的类中修改基类方法的行为。这被称为覆盖那个方法,要覆写一个方法,你只要直接在派生类里重新定义那个方法就行了。