在delphi中抽象方法有什么用?在后代中直接实现其方法不行吗?

解决方案 »

  1.   

    例如:对于下面3个类,TShape的Paint是纯虚的,没有实现。
    TShape=class
      function: Paint: Boolean; virtual; abstract;
    end;TRectangle=class(TShape)
      function: Paint: Boolean; override;
    end;TCircle=class(TShape)
      function: Paint: boolean; overrdie;
    end;可以有这样的函数:
    procedure PaintAShape(shape: TShape);
    begin
      shape.Paint;
    end;
    则你可以这样调用:
    var
      t:TRectangle;
      t1: TCircle;
    begin
      t := TRectangle.Create;
      t1 := TCircle.Create;
      PaintAShape(t);
      PaintAShape(t1);
    end;
    体会一下其中的乐趣吧,哈哈,没有那个纯虚的Paint,PaintAShape函数怎么可以
    直接shape.Paint;,:)有意思吧!
      

  2.   

    To zwjchina(蒲石) 
    再举个例子好吗?
      

  3.   


    有一点你要注意,就是类的私有方法可以被子类重载后
    增加可见性,也就是子类中可以让原来是私有的方法变成
    protected,或者public的。
    我现在说得更抽象一点
    TClassA=class
    private
      procedure DoA; virtual; abstract;
      procedure DoB; virtual; abstract;
      procedure DoC;
    public
      procedure DoThing;
    end;procedure TClassA.DoThing;
    begin
      DoA;
      DoB;
      DoC;
    end;TClassB = class(TClassA)
    private
      procedure DoA; virtual; override;
      procedure DoB; virtual; override;
    end;这里就要说得抽象一点了,对于TClassA的Dothing 它负责做一件事情,其中
    DoA,DoB, DoC分别是完成这件事情的3个步骤,但是可能有这种情况:DoA,DoB
    根据具体子类不同,其完成方式也不同。那么这个时候就需要子类重载这2个函数
    ,不过,有一点我要说的是,重载后他的表现不是通过调用DoA,或者DoB实现的,
    而是,你在调用TClassB的对象实例的DoThing时表现出不同行为的,你可以看出
    有了这种处理方式,程序员要写的重复代码大大减少了,同时也增加了你的对象
    的扩展性。