无论是先有鸡还是先有蛋,在抽象程序系统中,我们都认为是先有的蛋再有的鸡。蛋是鸡的原型是鸡的超类。
我们在程序设计的时候要随时都要有根弦,要记住,具体类不是用来继承的。我们可以使用重构的方法来把这个关系解决掉。我们可以设计一个它们的超类,然后让他们都继承那么超类。
然而这时候我们又有了一个要求,为了实现开闭原则,我们要尽量使得抽象类,应该具有更多的共同的代码,使得子类的重用更加深化。然而又要求抽象类拥有更少的数据,因为一个具体的类,无论是是否使用它的变量,都会在内存中使用空间,这样就没有必要让抽象类拥有更多的数据。
针对抽象编程,而不是针对具体编程。针对接口编程,而不是针对实现编程。
继承使用的Coad原则:
1)has a 与is a, has a 要用聚合或者组合来处理。
2)永远不要将一个子类替换另外一个子类的情况。如果不清楚当前的子类会不会在某时替换另外一个子类时,就不要将这个类设为这个超类的子类。
3)子类是拓展的责任,并不是,替换或者取消父类的接口的责任,如果发生这个,那么这个子类就不因该设另外一个类为超类。
4)工具类一般不具备与业务逻辑有分类学的关系,然而继承只建立在分类学的关系之上,也就是不要从工具类上继承。
Coad原则是里氏代换原则的衍生,里氏代换原则是是否使用继承的根本原则。