Delphi的学习笔记——类

对于类的结构声明,任意类名通过ctrl就可以查看其定义

1.类成员的可见性

private          //不可见  
protected     //派生类可见  
public           //可见  
published     //可见。用于运行时信息  
automated   //可见。用于兼容(只用于windows)  

在{$M+}状态下编译类时,它的默认可见性为published;否则,则它的可见性是public;

2.类方法调用

inherited(继承):就是调用父类的函数(类似JAVA类中的super,C++中使用baseClass::函数名调用)。如果不带参数就是默认调用父类的同名函数;如果带参数则表明子类中的函数的参数个数可能比祖先类要多取其中的几个参数传过去.

祖先类有个函数 Create(AName:string);  
子类有个函数 Create(AName:string;AComponent:TObject);override;  
那么子类的Create函数内就可以这样调用祖先类:  
procedure TAClass.Create(AName:string;AComponent:TObject);  
begin  
Inherited Create(AName);  
end; 
类方法可以看做是公共方法,对于类方法的调用。例如:

constructor TMyClass.Create;  
begin  
  inherited;  
  MyProc;  //调用类方法  
end;  
  
class procedure  TMyClass.MyProc;  
begin  
  ShowMessage('OK'); //类方法实现  
end;  
procedure TForm1.FormCreate(Sender: TObject);  
var  
  myclass : TMyClass;  
begin  
  TMyClass.MyProc;  //用类名调用类方法  
  myclass := TMyClass.Create;   //初始化对象  
  myclass.MyProc;  //对象调用类方法  
  myclass.Free; //释放对象  
end;  
3.覆盖虚方法(父类函数需要声明为dynamic,或者virtual方法,子类通过override重载) //  ?

dynamic和virtual在语意中是等价的,他们唯一的区别在于对方法调用策略的内部实现上:虚拟方法从速度最优角度实现代码优化,而动态方法是从空间最优

被覆盖的动态方法在派生类的VMT中不在出现,所以省时间,但查询熟读慢 . 虚拟方法反之.

//定义父类、子类方法  (声明
{父类}  
TParent = class  
protected  
  function MyFun(i:Integer):Integer;dynamic; //动态方法  
  procedure MyProc; virtual;  //虚方法  
end;  
{子类}  
TChild = class(TParent) //继承父类  
protected  
  function MyFun(i:Integer):Integer;override;  //覆盖方法  
  procedure MyProc; override;  
end;  
实现类的方法、过程
{TParent}  
function TParent.MyFun(i:Integer): Integer;  
begin  
  Inc(i);  //i++  
  Result:=i;  //返回变量i  
end;  
procedure TParent.MyProc;  
begin  
  ShowMessage('Parent');  
end;  
  
{TChild}  
function TChild.MyFun(i:Integer):Integer;  
begin  
  i:= inherited MyFun(i);  //继承父类的MyFun方法  
  Inc(i);  
  Result:=i;  
end;  
procedure TChild.MyProc;  
begin  
  inherited; //调用父类的MyProc方法  
  ShowMessage('child');  
end;  
实现子类方法的时候利用inherited来调用父类的方法。
4.抽象类考虑到抽象类在某种程度上可以用接口来代替,所以这里我并不在仔细对抽象类进行介绍。直接给例子:

{父类}  
TParent = class  
protected  
  function MyFun(i:Integer):Integer;abstract; //动态方法  
end;  
{子类}  
TChild = class(TParent) //继承父类  
protected  
  function MyFun(i:Integer):Integer;override;  //覆盖方法  
end;  
5.方法重载
{1.关于方法重载: 
 2.过程和函数之间可以重载 
 3.类内重载必须有 overload 关键字 
 4.子类重载必须有 overload 关键字,夫类可以没有 
 5.如果夫类是虚函数(virtual dynamic),子类重载时需要加 reintroduce 修饰词 
 6.published 区内不能重载}  
 //方法重载  
 TMyClass2 = class  
 protected  
   procedure MyProc1(i:Integer); overload; //重载方法  
   function MyFun1(s1,s2:string): string; overload;  
 end;  
6.参数默认值

function MyFun(a:Integer; b:Integer=1; c:Integer=2): Integer;
7.属性的自动完成
在Type区写入
TMyClass = class  
    property s: string;  
  end;  
然后把光标放在其中,执行Ctrl+Shift+C。Delphi会自动生成属性的相关代码
TMyClass = class  
  private  
    Fs: string;  
    procedure Sets(const Value: string);  
  published  
    property s: string read Fs write Sets;  
  end;  
{ TMyClass }  
procedure TMyClass.Sets(const Value: string);  
begin  
  Fs := Value;  
end;  

8. 对TClass的调用(可读性好):
type TMyClass = class(TObject)  
...  
end; 
9.Forward声明( 提前声明类)
type  
   TFigure = class;  
   TDrawing = class  
      Figure : TFigure;  
      ...  
   end;  
   TFigure = class  
      Drawing: TDrawing;  
      ...  
    end;  



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值