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