为什么在TComponent的派生类中无Create方法?(30分)

  • 主题发起人 主题发起人 awfigsk
  • 开始时间 开始时间
A

awfigsk

Unregistered / Unconfirmed
GUEST, unregistred user!
所有的类都是从TObject中继承的,TObject类中的方法也应当被所有的子类所约继承,但为何在TComponent的子类中无没有带有参数的create方法?而只有带有参数的Create(...)的方法?
 
已经override了。
 
TComponent需要一个父类控件做容器,而让它存在的!
 
to fsldg:override了,也应该在子类中可以继承呀,但为何在子类不能调用到create方法呢?如:
TTest=class(TComponent)
end;

var
a:TTest;
begin
a:=a.create
//错误
...
end;
 
(nil)试下
 
Type
TTest = class (Tcomponent)
public
constructor Create
reintroduce
overload;
end;
......

constructor TTest.Create;
begin
inherited Create(nil);//或者inherited Create(Application);
end;

..................................

var
a:TTest;
begin
a:=a.create;
...
end;
 
這是要你自己建立一個才行呀。
constructor Create
reintroduce
overload;
 
to royal1442,TObject类本身就带有无参数的Create方法,为何这里还要定义?不能直接继承使用吗?
 
TComponent需要一个父类控件做容器,而让它存在的!

就像是TButton控件类,如果没有Owner(TForm、或者其它容器)的存在,TButton是无法存在的!皮之不存,毛将焉附?
 
我不是指这个意思,我是问为何TComponent的子类不能使用从TObject的create方法?
 
TComponent 是 TObject的子类,那么,根据多态的原理, TObject的create方法是执行其具体子类的Create方法的!
再说了,TObject的create方法里面也没什么内容啊!
建议你的类从TObject上继承吧
 
肯定有这个方法!你试试吧
 
我试了,不能调出来,所以我才发贴向各位大侠求助!谢谢!
 
Type
TTest = class (Tcomponent)
public
constructor Create(Owner: TComponent);override;
end;
......

constructor TTest.Create(Owner: TComponent);
begin
inherited Create(Owner);
end;
 
不知你注意没有,TObject的Create是普通构造函数,因他什么都没做,其实这个Create可以为任何名称,只要有constructor,编辑器就会创建这个对象,因为这里创建时没有做其它的任何事情,所以这里不做虚函数,可以节省找VMT的时间,其实这个Create的真正起点是在Tcomponent这个函数,因为它有额外做了点事所以子类要继承这个构造函数以完成对Tcomponent部分的初始化工作不知我这样的解释你能不能明白,Create不是构造函数必须的而是constructor这个关键字才是必须的
 
我是问为何create在子类中不能用小数点.调出来?
 
父类没有CEREATE的就不用,要初始化的才需用做CREATE工作。
 
我的理解是这样的:

1, 在TObject类中 有Create 构造函数, 从TObject派生的类, 如果override Create, 那么子类将调用本身的Create, 如果子类没有写具体的构造函数,那么 子类的构造将调用父类的构造函数.
2. 在TComponent类中,构造函数Create带有参数, 声明如下:
constructor Create(AOwner: TComponent)
virtual;
这个构造函数返回的是TComponent的对象,它的实现如下:
FComponentStyle := [csInheritable];
if AOwner <> nil then AOwner.InsertComponent(Self);

说明Tcomponent的构造函数必须依赖容器组件, 就是AOwner.
事实上在TComponent的父类TPersistent(持久化类没有构造方法)乃至 TPersistent的父类TObject类 都没有实体的Create. 且, Tobject的构造函数不是虚拟的, 所以就算是从Tobject直接派生一个类,也无法使用Tobject的构造函数, 只是所有类在构造时, 都调用了相同的地址开辟.
 
这应该是IDE的问题,因为create在这些类中没有重载,所以列不出来啊。
 
后退
顶部