http://www.yesky.com/20011201/207901.shtml

解决方案 »

  1.   

    1.  什么是抽象类抽象类仅提供一个类型的部分实现。抽象类可以有实例变量,以及一个或多个构造函数。抽象类可以同时有抽象方法和具体方法。一个抽象类不会有实例,这些构造函数不能被客户端调用来创建实例。一个抽象类的构造函数可以被其子类调用,从而使一个抽象类的所有子类都可以有一些共同的实现,而不同的子类可以在此基础上有其自己的实现。 2.  抽象类的用途1)  具体类不是用来继承的。 Scott Meyers曾指出,只要有可能,不要丛具体类继承。2)  假设有2个具体类,类A和类B,类B是类A 的子类,那么一个最简单的修改方案是应当建立一个抽象类(或java接口)C,然后让类A和类B成为抽象类C的子类。3)  抽象类应当拥有尽可能多的共同代码。以提高代码的复用率。4)  抽象类应当拥有尽可能少的数据。 3.  基于抽象类的模式和原则1)  针对抽象编程,不要针对具体编程。2)  尽量使用合成(Composition),而不要使用继承来达到复用的目的。3)  使用摸板方法模式 4.  什么时候应当使用继承复用1)  子类是超类的一个特殊种类,而不是超类的一个角色,也就是要区分”is – a” 和“has-a”两种关系。2)  永远不会出现需要将子类换成另一个子类的情况。如果设计师不是很肯定一个类回不会在将来变成另一个类的子类的话,就不应当把这个类设计成这个超类的子类。3)  子类具有扩展超类的责任,而不是具有置换掉(Override)或注销掉(Nullify)超类的责任。4)  只有在分类学上有意义时,才可以使用继承,不要丛工具类继承。
      

  2.   

    一般讲述对象概念的书都会讲到这个问题。
    我对这个概念的理解也很肤浅,说说我的理解吧。
    首先抽象类不能被实例化,这就是不能有构造函数直接生成该类的实例。
    其次抽象类包含抽象方法,也就是类的定义中只有改方法的声明而没有定义。
    第三抽象类必须可以被继承,否则不能实例化也不被继承的类是没有意义的。继承的类中必须实现所有抽象方法。
    举个例子,不能确定是否贴切(c#)
    假设人只有两种男人和女人(其它人类不在考虑范围之内)
    public abstract class Person
    {
    protected bool male;
    public abstract bool IsMale();
    } public abstract class Male: Person
    {
    public Male()
    {
    male = true;
    } public override bool IsMale()
    {
    return male;
    }
    } public abstract class Female: Person
    {
    public Female()
    {
    male = false;
    } public override bool IsMale()
    {
    return male;
    }
    }
    不知道这能否说明问题,有什么不当之处还请指正。