(7) 抽象类

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

// 父类(抽象类)
  TMyForm = class abstract  //抽象类, 在D7上好像不能这样写。
//strict 是delphi2007以上版本新增的关键字(包括2007),用于在同一PAS文件夹下保护类私有成员不被使用。如果父类与子类不在同一单元下可以省略
    strict private
      FName : string;
      FAge : Integer;
    protected
      procedure ShowName(Name:string;Age:Integer);virtual;abstract;  //抽象方法,一个类中有一个抽象方法即成了抽象类,抽象类不可创建对象,只能通过子类创建
  end;

// 子类
  TMy = class(TMyForm)
    Strict private
      SName : string;
      SAge : Integer;
    protected
      constructor create;
      destructor  Destroy;
      procedure ShowName(Name:string;Age:Integer);override; //覆盖抽象方法
  end;

var
  Form1: TForm1;
implementation

{$R *.dfm}



{ My }

constructor TMy.create;
begin
  SName := 'Tony';
  SAge := 19;
  ShowName(SName,SAge);
end;

destructor TMy.Destroy;
begin
  SName := 'Tom';
  SAge := 19;
  ShowName(SName,SAge);
end;

procedure TMy.ShowName(Name: string; Age: Integer);
begin
  ShowMessage(Name + IntToStr(Age));
end;

//..........................................................................

{实现过程}
procedure TForm1.Button1Click(Sender: TObject);
var
  My1 : TMy;        //子类对象
  My2 : TMyForm;    //父类对象
begin
  My1 := TMy.create;     //子类创建实例
  //父类创建实例,但是父类只能通过子类来创建。 (其实也可以写成 My2 := TMyForm.create 这样可以编译程序,但是这样做没有任何意义,而且不安全。)
  My2 := TMy.create; //这里也会执行子类的ShowName方法。 输出名字与年龄;
  My1.Free;
  My2.Free;
end;

end.




最后总结 :
         抽象类没有实现过程。
         感觉抽象类的存在就是给子类做一个奠基, 让子类必须包含这些属性/方法,比如: 定义一个猫科动物类,猫科动物有很多种,老虎,狮子,豹子等等
         但是我们不能在猫科动物这个类中把所有动物都写进去,因为不同的动物还有不同的生活习惯,所以,抽象类就提供了这样一个规则。我定义一个猫科动物的
         抽象类,猫科动物必须包含一个食物的属性,而子类就可以根据需要修改食物。  至此,抽象类的个人理解完成

原文地址:https://www.cnblogs.com/mdnx/p/2576124.html