<Delphi高手突破>中的错误? (200分)

D

delphiandoracle

Unregistered / Unconfirmed
GUEST, unregistred user!
to yanghaijun,
你的<<Delphi3 从入门到精通是电子版吗?
 
G

gyang

Unregistered / Unconfirmed
GUEST, unregistred user!
各位真细心啊
 
D

delphifans_hx

Unregistered / Unconfirmed
GUEST, unregistred user!
第13页的最后一句话:
  “。。。。。。此外,由于Object Pascal中所有的类(除了TObject类本身)都是
从TObject类派生,因此编绎器会调用TObject.Create()构造函数。不过,这个函数只是
一个空函数。”

我:既然是一个空函数,那还调用它干啥呢?依这句话的意思,所有的类(除TObject外
),都会调用TObject.Create()这个函数。实际上,要是这些派生类定义了它们自己的
Constructor,而没有用inherited关键字来调来父类的构造过程,那么派生类是没有机
会调用TObject.Create()的。

TOBject一定作了初始化的工作的, 只不过被编译器”隐藏“了而已
 
K

knwang

Unregistered / Unconfirmed
GUEST, unregistred user!
1有点问题
看编译器对Tobject.create();的动作
mov dl,$01
mov eax,[$00401074]
call Tobject,create
可知,不管create()是不是为空,它总是被调用的,实际是编译器把一些语句给加上去了
同意2,3
4理解有误
>>1。寻找该消息的处理函数
>>2。如果没有找到而
>>3。该类覆盖了TObject的DefaultHandler(),则调用该类的DefaultHandler();
作者如果该类覆盖了DefaultHandler才调用。
>>如果两者都不存在,则继续在其基类中寻找
作者是说在基类中寻找,也就是基类中重复上述三个步骤。
 
N

Nicrosoft

Unregistered / Unconfirmed
GUEST, unregistred user!
to wr960204:

至少以Borland为标准的Object Pascal(事实上,Pascal标准已经被borland垄断),所有的类都派生自TObject。

这点,OP是效仿SmallTalk语言的单继承结构的(SmallTalk的原始类是Object)。
 

太阳火

Unregistered / Unconfirmed
GUEST, unregistred user!
哪里有Mastering Delphi英文版买??
 
W

wr960204

Unregistered / Unconfirmed
GUEST, unregistred user!
to Nicrosoft
我认为说VCL框架所有的类都派生自TObject更严谨一点。没别的意思,讨论一下
 
N

Nicrosoft

Unregistered / Unconfirmed
GUEST, unregistred user!
to wr960204:

:)我认为,TObject已经是OP语言的一个特性,语言/编译器会强制每个类从TObject派生。因此说VCL应该是不恰当的,难道CLX的类就不是从TObject派生的了?

呵呵。
 
N

Nicrosoft

Unregistered / Unconfirmed
GUEST, unregistred user!
to 楼主:
第一个问题:空函数调用和不调用是有区别的,TObject规定一个Create,只是规定了一个接口,只是它在TObject这一层是空函数。派生类(尤其是组件)可以override Create的。
第二个问题:您的说法也没错,不过从OOP概念上来说,创建抽象类的实例类似于除以0,没有意义。
第四个问题:如果同一层的类中有defaultHandler,那么就不会调用父类的任何东西了。
 
W

wr960204

Unregistered / Unconfirmed
GUEST, unregistred user!
to Nicrosoft

Type
TA=Object
end;
TB=Object(TA)
end;
你看看TA,和TB是不是TObject的派生类!!
 
S

samboy111

Unregistered / Unconfirmed
GUEST, unregistred user!
Nicrosoft,好:
长久不见,5。1没回上海吧。
你什么时候把MIDIFORM的SKIN、SHOWMESSAE SKIN做出来呢,
羡慕你对VCL研究得那么深,
不知道准备结婚没?
 
X

xf-wangyi

Unregistered / Unconfirmed
GUEST, unregistred user!
OP是单根继承
Type
TA=Object
end;
TB=Object(TA)
end;
中的TA应也是隐式的从TObject中继承下来
 
W

wr960204

Unregistered / Unconfirmed
GUEST, unregistred user!
to xf-wangyi
不要想当然。你应该先动手再查资料然后再说话。
Type
TA=Object
end;
TB=Object(TA)
end;
其中TA确实不是从TObject继承下来的。它根本就不属于VCL类库。着是比VCL更古老的方式的保留。
KOL类库就不是从TObject继承的。而是以这种方式来构造类库的
 
N

Nicrosoft

Unregistered / Unconfirmed
GUEST, unregistred user!
to wr960204:TA和TB都是TObject的派生类。不信,你可以调用TObject的方法看看,呵呵
xf-wangyi说的是对的

TA=class会被编译器自动编译成TA=class(TObject)

to samboy111:是啊,最近实在忙,5.1没回去,回去要被隔离的,呵呵。MDI正在开发:)
结婚还早,呵呵
 

胡柚

Unregistered / Unconfirmed
GUEST, unregistred user!
wr960204把VCL和TObject弄混了
 
N

Nicrosoft

Unregistered / Unconfirmed
GUEST, unregistred user!
to wr960204:
TA = class
end;

而:
procedure TForm1.Button1Click(Sender: TObject);
var
O : TA;
begin
O := TA.Create();
ShowMessage(O.ClassName);
O.Free();
end;
可以编译运行,我想你也知道,ClassName和Free以及Create是属于谁(TObject)的
 
N

Nicrosoft

Unregistered / Unconfirmed
GUEST, unregistred user!
OK,关于这个问题,我觉得根本没有争论的必要了。因为事实太明显了,另外你可以看一下李维的“Delphi的原子世界”那篇文章。

好了,bye,不在回帖,干活去了:)
 
W

wr960204

Unregistered / Unconfirmed
GUEST, unregistred user!
To Nicrosoft
为何不再争论
Type
TA=Object ////看好了,这里不是Class,而是Object。呵呵,会去查查书吧。
end;
PB=^TB;
TB=Object(TA)////看好了,这里不是Class,而是Object。呵呵,会去查查书吧。
end;
var
B:pB;
New(B)

你看看吧。我劝各位还是去扩充一下知识面吧
嘿嘿,我还以为写书的人一定很严谨认真呢!如果一个问题不弄清楚一味回避,我看有损Pascal
的严谨吧。
嘿嘿....
 
N

Nicrosoft

Unregistered / Unconfirmed
GUEST, unregistred user!
to wr960204:原来是object,呵呵,这个不在书的讨论范围之内。没看清你的问题,不好意思了 :)
 
N

Nicrosoft

Unregistered / Unconfirmed
GUEST, unregistred user!
而Object的存在纯粹是为了保持兼容性,Borland并不推荐使用。

这就和C++为了兼容C,保持了很多C的特性一样。如果一定要把这些特性拿出来说C++的OOP特性,那就不合适了。
 
顶部