关于窗体Create方法重载的问题

debussy 2002-05-29 09:38:16
我新建了一个窗体,这个窗体因为是继承于TForm,所以Create方法只有一个(AOwner: TComponent)参数,我希望在使用这个窗体的时候能够多传一个参数进去,所以我想是否可以重载这个Create方法,比如按照下列格式:
public
constructor Create(AOwner:TComponent,OpType:integer);override;


constructor TMyForm.Create(AOwner:TComponent,OpType:integer);
begin
inherited;
//Using Optype here
end;
不知道这样做有没有问题,但是编译不能通过阿,出现下列错误;
Error:Declartion of "Create" differs from preverious declartion
Error:Incompatible of types
Error:Undeclared identifier "OpType"

请问如果我要实现我的要求,该怎么做?
...全文
306 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
debussy 2002-05-29
  • 打赏
  • 举报
回复
这里有一个初学者经常混淆的概念。覆盖(override)和重载(overload)。上面说了,覆盖是指子类重新定义父类的虚函数的做法。而重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。其实,重载的概念并不属于“面向对象编程”, 重载的实现是:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如,有两个同名函数:function func(p:integer):integer; 和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。对于这两个函数的调用,在编译器间就已经确定了,是静态的(记住:是静态)。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!真正和多态相关的是“覆盖”。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态(记住:是动态!)的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚邦定)。结论就是:重载只是一种语言特性,与多态无关,与面向对象也无关!


--------摘自nicrosoft的浅谈多态——概念描述
debussy 2002-05-29
  • 打赏
  • 举报
回复
lxpbuaa(桂枝香在故国晚秋)兄,你再看看相关文档?你也把重载(overload)和覆盖(override)混淆了,呵呵。
debussy 2002-05-29
  • 打赏
  • 举报
回复
怎么总给不了分??
老是这么说:贴子回复次数大于跟给分次数
cxx1997 2002-05-29
  • 打赏
  • 举报
回复
哎,来晚
Jerry529 2002-05-29
  • 打赏
  • 举报
回复
同意伴水。
MSHawk 2002-05-29
  • 打赏
  • 举报
回复
实际上申明不同参数的同名函数的话,编译器自动处理为overload。
debussy 2002-05-29
  • 打赏
  • 举报
回复
nicrosoft说初学者经常混淆override和overload,Sigh!
lxpbuaa 2002-05-29
  • 打赏
  • 举报
回复
zswang(伴水)(* 嘻嘻 *) 的方法是可行的。但是这样就不叫重载了,重载的意思是不能改变申明,但是可以改变实现。

—————————————————————————————————
MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
毁誉由人,望天上云卷云舒,聚散任风。';
if Not Assigned(I) then
I := TI.Create(Nil);
I.Maxim := MaximStr;
I.Explain := '假如上述代码中出现“OA”、“3D”等字样,改为“=”或者去掉';
I.Desire := '加不加分随你';
—————————————————————————————————


debussy 2002-05-29
  • 打赏
  • 举报
回复
分分可不可以收回来啊?我已经知道解决问题的办法了。我不应该用override,我应该用overload.我是参看了nicrosof的关于多态的文章才明白的。应该这么做:

constructor Create(AOwner:TComponent;optype:integer);overload;


constructor TMyForm.Create(AOwner:TComponent;optype:integer);
begin
Self.Create(AOwner);//不过可能伴水兄的方法更规范罢
OperType := optype;
end;

lxpbuaa(桂枝香在故国晚秋) 兄,并不是不能直接加,如果我重载了就可以,这就是overload的本意阿,对于父类的方法如果子类里面需要不同的参数来实现,就可以使用overload.而且你也没有说清楚具体应该怎么做,所以分分给伴水兄了。:)

lxpbuaa 2002-05-29
  • 打赏
  • 举报
回复
想直接在Create中加参数是不可能的。不过你可以定义一个属性,或者方法,传入这个参数就行了阿。

—————————————————————————————————
MaximStr := '宠辱不惊,看庭前花开花落,去留无意;
毁誉由人,望天上云卷云舒,聚散任风。';
if Not Assigned(I) then
I := TI.Create(Nil);
I.Maxim := MaximStr;
I.Explain := '假如上述代码中出现“OA”、“3D”等字样,改为“=”或者去掉';
I.Desire := '加不加分随你';
—————————————————————————————————


王集鹄 2002-05-29
  • 打赏
  • 举报
回复
constructor TForm1.Create(AOwner: TComponent; OpType: Integer);
begin
inherited Create(AOwner);
end;

5,930

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧