用了这么久delphi,到现在仍然对构造函数不是很清楚
1、constructor Create(AOwner: TComponent); override;
constructor Create(AOwner: TComponent);
上面两个的区别?
构造函数跟一般函数的继承重载上有些什么区别,
希望大家讨论下,总结下。
1、constructor Create(AOwner: TComponent); override;
constructor Create(AOwner: TComponent);
上面两个的区别?
构造函数跟一般函数的继承重载上有些什么区别,
希望大家讨论下,总结下。
解决方案 »
- 欲哭无泪:多年来的资料全部被格了
- 急急急.......!!!SQL数据库问题,麻烦高手进来帮我看看```
- 获取窗口句柄的问题
- 祝伯虎同志结婚新禧,还没有到时间,怕到时候忘了
- 有关编辑框的问题
- ==我用ADO访问ACCESS。我使用sql建立了一个表,但是如何删除表?
- 请教打印图片的问题?急急!!
- 如何任意展开treeview的任意一级节点?
- Desktop Database数据表中怎么建立外键呢
- 我用datetimepicker获得日期,保存到数据库SQL里,时间会自动变为1905年,我只要日期,不要时间,请高手帮忙
- delphi中 可移动圆点
- IPHONE和Android都可用的「热门软件」开发源码
constructor Create(AOwner: TComponent); override; //可以继承祖先的构造方法,也可以让子类继承
constructor Create(AOwner: TComponent); //不能让子类继承。如果在实现部分加入:inherited Create(AOwner);可以继承祖先的构造方法。
override用于把子类的函数覆盖掉父类的同名函数(前提是父类函数声明为virtual).当你用父类的容器去装一个子类的实体时才会体现出它的作用:如果子类该函数没有override的话,执行的将是父类的函数;反之则执行子类的函数.
不过老实说我确实没太搞懂delphi为什么需要把构造函数申明成虚函数. TComponent的构造函数就是虚函数,子类,比如Tcontral都是override了父类的create(不过在override时候inherited了父类的构造函数).如果是成员函数,我明白虚函数的用处,但对于构造函数,delphi里一般都是这样使用: a:=Ta.create; 那子类是否override似乎并没什么区别.除非是直接使用a.create 这样的方式调用才行.
子类下可不可以为public
http://dev.csdn.net/htmls/77/77003.html
通过这篇文章终于找到点儿区别,引用一下,写一个小例子,供大家参考Taaa = class
public
constructor Create(a: String);virtual;
end; Tbbb = class(Taaa)
public
constructor Create(a: string);
end; Tccc = class(Taaa)
public
constructor Create(a: string);override;
end; Taaaclass = class of Taaa;{ Taaa }constructor Taaa.Create(a: String);
begin
ShowMessage('Taaa');
end;{ Tccc }constructor Tccc.Create(a: string);
begin
inherited;
ShowMessage('Tccc');
end;{ Tbbb }constructor Tbbb.Create(a: string);
begin
inherited;
ShowMessage('Tbbb');
end;用法一:这样似乎没有什么区别,都能正确的构造对象。
procedure TForm1.btn1Click(Sender: TObject);
var
a: Taaa;
begin
a := Taaa.Create('');
a := Tbbb.Create('');
a := Tccc.Create('');
end;用法二:如果这样用的话,虚方法就起到作用了
procedure TForm1.btn2Click(Sender: TObject);
var
a,b,c: Taaaclass;
begin
a := Taaa;
b := Tbbb;
c := Tccc; b.Create(''); //调用的是Taaa的构造函数,Tbbb中没有覆盖父类的构造方法
c.Create(''); //调用的是Tccc的构造函数,Tccc中覆盖了父类的构造方法end;不知道说清楚了没有,呵呵
可以看其实现的代码中会自动加了 inherited 这说明可以用其所有上级的Create
constructor Create(AOwner: TComponent);
这个代码中是不会自动加的,所以不能用其上级的哦。。其实constructor Create 方法是默认虚拟的方法。
是通过类来调用的类方法,与其他对象方法不一样。所以其可以创建对象、、
procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
var
Instance: TComponent;
begin
Instance := TComponent(InstanceClass.NewInstance);
TComponent(Reference) := Instance;
try
Instance.Create(Self);
except
TComponent(Reference) := nil;
raise;
end;
if (FMainForm = nil) and (Instance is TForm) then
begin
TForm(Instance).HandleNeeded;
FMainForm := TForm(Instance);
end;
end;
看这一句 Instance.Create(Self); 自己思考一下,假如TCustomForm的Create没有override的话,使用
Application.CreateForm(TForm1, Form1); 还能否正常?