Delphi封装,继承,多态,接口,命令统计

命令说明
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.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值