命令 | 说明 |
---|
program | 程序 |
uses | 引用单元 |
unit | 单元 |
interface | 声明区域 |
implementation | 实现区域 |
initialization | 初始化区域 |
finalization | 销毁区域 |
type | 类声明 |
var | 变量声明 |
class | 类/类方法(类方法调用时不需要创建对象) |
private | 私有的 |
public | 公有的 |
published | 公有的可产生类型信息 |
Protected | 受保护的 |
Procedure | 方法(过程)没返回值 |
function | 函数有返回值 |
constructor | 构造方法 |
destructor | 析构方法 |
property | 属性 |
overload | 函数重载 |
override | 重写(覆盖) |
virtual | 虚方法(VMT)速度快占用空间大 |
dynamic | 动态方法(DMT)节约空间速度慢 |
abstract | 抽象方法(前提是虚函数或动态函数) |
implements | 委托实现 |
interface | 接口 |
//新单元----------------------------------------------
unit Unit1; //新单元
interface //声明区域
type
d = interface // d 是个接口 接口只有public 不用写
['{A9B35374-9417-496A-B5D5-4D75B2553BF9}'] //ctrl+shift+G自动生成
Procedure dd1(); //接口空方法,不能实现 类继承接口必须实现全部方法
Procedure tiao(); //(十五)委托实现
end;
d1 = interface(d) //口也可以继承接口,单继承
Procedure dd2(); //接口空方法,不能实现
end;
e = class(TInterfacedObject)
public
procedure ERun();virtual;abstract;//(十三)抽象方法
end;
f = class(e,d) //继承e和接口 不想继承类直接继承TInterfacedObject 可多继承 也可以继续继承d1
public
Procedure dd1(); //接口实现
procedure ERun();override;// (十三)实现父类抽象方法
procedure Tiao(); //(十四)自己的方法
end;
g = class(e,d)
private
FFF : d;
public
property BZD:d read FFF write FFF implements d; //(十五)委托实现 implements 关键字 属于多态的一种
end;
a = class //声明个a类
private //私有的
Fname:string; //名字字段
FAge:Integer ; //年龄字段
FTzhong:Integer ; //(六.继承)体重
function GetAge(): Integer; //(四)function必须有返回值 这是个函数,函数必须有返回值GetAge获取年龄,随便改名非固定
Procedure SetAge(Age1:Integer); //(四)Procedure没有返回值 私有AGE修改方法(过程)被属性调用
Protected //受保护
Aname:string; //(五)受保护只能子类访问
//published //公有 可产生类型信息
public //公有的
constructor Aaa();overload; //构造方法①(一) 默认Aaa最好写Create
constructor Aaa(Name1:string);overload; //②(二)构造方法函数重载 overload
constructor Aaa(Tz1:Integer);overload; //(七)构造方法函数重载 overload
Procedure SetName(Name:String); //Procedure没有返回值 声明个方法(过程) CTRL SHIFT C 生成实现
destructor Destroy();override; //destructor销毁对象的方法(过程) Destroy不能改成别的 重写(覆盖)-override
property Name:string read Fname write Fname; //(三)属性(原型)property (Name:string外界访问的名称) (read Fname write Fname read读write写哪个字段)
property Age:Integer read GetAge write SetAge; //(四)属性(原型)property (Age:Integer外界访问的名称) (read GetAge读私有GetAge函数 write SetAge写私有SetAge方法(过程))
property Tz:Integer read FTzhong write FTzhong; //(六.继承)给子类使用的属性(原型)
Procedure GetName();virtual; //(八)声明一个虚方法(过程)
//Procedure Run();dynamic; //(九)声明一个动态方法(过程) 使用方法和虚方法一致
class procedure Run(); //(十)类方法 通过类名直接调用
procedure Eat();virtual;abstract; //(十一)抽象方法(编程规范或者规则)前提必须是虚方法(动态或者虚方法) 一般写在父类 只声明不实现 非要实现也不是不成 但一般不实现
{虚方法(VMT)速度快占用空间大 动态方法(DMT)节约空间但只能逐级查找速度慢}
end;
b = class(a) //(五)派生类(子类) a的子类 继承a
public
constructor Aaa(); //(六.继承)子类构造方法
Procedure bbb(); //(五)访问Protected的内容
Procedure GetName();override;// (八)重写(覆盖)-override父类a的虚方法
procedure Eat(); //(十一)抽象方法在子类声明
end;
c = class(a) //((六.继承)派生类(子类) a的子类 继承a
public
constructor Aaa(); //(六.继承)子类构造方法
end;
implementation //实现区域
{ a }
procedure a.SetAge(Age1: Integer);//(四)函数实现 写
begin
Self.FAge:=Age1;
end;
procedure a.SetName(Name: String); //实现a类的 SetName
begin
Fname:=Name;
end;
constructor a.Aaa; //构造方法实现① (一)
begin
Writeln('成功调用bc的父类构造方法a');
end;
constructor a.Aaa(Name1: string); //(二)实现有参构造方法
begin
self.Fname:=Name1; //self表示本类的加不加都行,为了区分同名变量
end;
constructor a.Aaa(Tz1: Integer);
begin
self.FTzhong:=Tz1;//(七)有参构造赋值
end;
destructor a.Destroy; //销毁对象的方法(过程)实现
begin
Writeln('调用a的父类销毁对象成功'); //FreeAndNil(aa); 调用本方法(过程)
inherited; //调用父类销毁对象的方法
end;
function a.GetAge: Integer; //(四)函数实现 读
begin
result := Self.FAge; //返回值是本类的年龄变量
end;
procedure a.GetName;
begin
Writeln('A类虚方法');
end;
class procedure a.Run; //(十)类方法实现
begin
Writeln('类方法实现');
end;
{ b }
constructor b.Aaa; //(六.继承)b子类构造方法实现①
begin
Writeln('成功调用b类构造方法');
inherited Aaa; //调用父类a的构造方法
inherited Aaa(1001); //调用父类a的有参构造方法赋值体重
end;
procedure b.bbb; //(五)访问Protected的内容实现
begin
Writeln(Aname);
end;
procedure b.Eat; //(十一)抽象方法在子类实现
begin
Writeln('抽象方法实现');
end;
procedure b.GetName;
begin
inherited;//什么都不加就调用父类同名的方法
Writeln('b重写a类虚方法');
end;
{ c }
constructor c.Aaa; //(六.继承)c子类构造方法实现①
begin
Writeln('成功调用c类构造方法');
end;
{ f }
procedure f.dd1; //实现接口方法
begin
Writeln('接口实现');
end;
procedure f.ERun; //(十三)
begin
Writeln('ERun实现');
end;
procedure f.Tiao;
begin
Writeln('F的tiao'); //(十四)
end;
initialization //初始化区域
finalization //销毁区域
end.
//主程序----------------------------------------------
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils,
windows,
Unit1 in 'Unit1.pas';
var
//变量:变量类型
aa:a; //声明一个a类的对象aa
// bb:b; //声明一个b子类对象bb
// dd:d; //(十二)接口对象dd
// ee:e; //(十二)e类对象
ff:f; //(十二)F类对象
gg:g; //(十五)委托实现
BZD:d; //(十五)委托实现
procedure pao(ee:e);//(十三)ERun的实现方法 (向上转型)子类对象转换成父类数据类型
begin
ee.ERun;
{if ee.ClassName = 'f' then //检测类名等于f
begin
ff:=f(ee);//(向下转型)父类对象转换成子类数据类型 强制类型转换
ff.Tiao;
end;}
if ee is f then //is 判断一个对象是否和另一个类型兼容
begin
ff := ee as f; //as 将一个对象转换成其他派生类 官方推荐写法
if Assigned(ff) then begin //判断是否为空
Writeln('非空');
ff.Tiao;
end;
end;
end;
begin
aa := a.Aaa; //通过类的构造方法,创建一个类的对象
//aa := a.Aaa; //有构造函数的情况下可以这么创建对象①(一)
aa:= a.Aaa('ZS');//②(二)调用有参构造方法创建对象
//Writeln(aa.Name); //(三)通过属性访问Fname 读read
//aa.Age:=18; //(四)通过属性访问私有函数写write
//Writeln(aa.Age); //(四)通过属性访问私有函数读read
//aa.SetName('张三'); //aa调用类的方法
Writeln(aa.Name); //打印到控制台
//aa.Free(); //释放aa对象
FreeAndNil(aa); //释放aa对象并且把aa指向空,这么销毁最好
//bb:=b.Aaa; //(六.继承)调用b的构造方法 ,创建一个子类的对象
//bb.Tz := 100; //(六.继承)b子类调用a父类属性给a类FTz体重赋值
//Writeln(bb.Tz); //(六.继承)调用显示体重
//bb.GetName; //(八)子类对象调用子类重写父类方法,实际:调用子类重写的方法 子类内添加inherited;会调用父类虚方法,子类也执行
//FreeAndNil(bb); //(六.继承)释放子类对象
//a.Run(); (十)类方法直接调用 也可以通过对象调用aa.Run();
//ee:=e.Create; //(十二)创建e类对象
//ee:=f.Create; //(十二)e类创建f类对象 这就是多态
//ee.ERun; //(十三)e虚方法f实现
//pao(f.Create); //(十三)写方法实现ERun,这里传不同对象就可以实现不同方法
gg:=g.Create; //(十五)委托实现
gg.BZD := f.Create; //(十五)委托实现
gg.BZD.tiao; //(十五)委托实现
Readln; //卡住控制台不关闭
end.