overload与overwrite的区别
overload--过载:同一类中实现名字相同的函数或过程,但它们的参数列表或返回类型不同
overwrite--重载:子类中用来覆盖父类中名字相同的函数或过程,以实现子类中该函数或过程的、使其不同于父类中同名函数或过程的功能,它与父类中同名函数或过程具有相同的参数列表(个数、数据类型)和返回值。
Override是在Runtime时候判断的,而Overload是在Compile-Time时候判断的
对于Constructor,只能Overload,而不能Override
尽量少用Overroad,就算用了也尽量使用不同数目的参数,以免client混淆。
Item | Override覆写 | Overload重载 |
位置 | 存在于继承关系的类中 | 存在于同一类中 |
方法名 | 相同 | 相同 |
参数列表 | 相同 | 必须不同 |
返回值 | 相同 | 可以不相同 |
关于destroy析构器、free、nil
调用构造器constructor操作系统会分配内存,而调用析构器destroy将会释放内存
destroy是Tobject类的一个虚拟析构器,当然你并不需要自定义一个析构器
free是TObject类的一个对象方法,其他所有的类都会继承该方法。free对象方法会在调用destroy虚拟析构器之前检查当前对象是否为nil,但free不会把对象设置为nil,要想让某个对象变量设置为nil,必须自己用代码写。
可以这样测试
procedure TForm1.Button1Click(Sender: TObject);
var
x : TButton;
begin
x :=TButton.Create(self);
x.Parent:=self;
x.Left :=10;
x.Top :=10;
x.Height :=20;
x.Width :=100;
x.Caption :='CLICK HERE';
//x.Show;
x.Free;
//x :=nil; //有这句和没这句结果是不一样的了
//FreeAndNil(x);<=====> x.Free;x :=nil;
if x=nil then
application.MessageBox('X IS NIL','TIPS')
else
application.MessageBox('X IS NOT NIL','TIPS');
end;