它的父类的父类TObject也有一个方法Create.
问题出现了。子类中使用方法名称与父类〔再父类〕的方法名相同而参数不同时,后缀应该是什么呢?
换个说法。
type
TMyClass = class
procedure One;virtual;
end;
type
TNewClass = class(TMyClass)
procedure One;virtual;
end;
这段代码也对了?不是吧。
(2)我看到一个abstract后缀。帮助中有一段话。不知怎么翻译。
You can call an abstract method only in a class or instance of a class in which the method has been overridden.
我译的结果是:你只能在一个类中或一个派生类的实例中调用abstract方法。不明白是什么意思。
以TStrings为例。insert 方法如下声明:
procedure Insert(Index: Integer; const S: string); virtual; abstract;
有一个派生类TStringList
使系统有了多态性的特点。但abstract的作用是什么呢。是使TStrings不能建立自己的实例吗。那就是说abstract不是必须的了。应该不是这样吧。谁能告诉我abstract后缀的必要性是什么呢?不用行不行?
8 个解决方案
#1
关注!
#2
>>>>>问题出现了。子类中使用方法名称与父类〔再父类〕的方法名相同而参数不同时,后缀应该是什么呢?
override;
>>>>>>procedure Insert(Index: Integer; const S: string); virtual; abstract;
它本身不能被实例化,只有继承类对它继承后才能实例;
这就是多态性的优点
比如TButton1.Onclick(Sender:TObject);
这里的Sender初看是TObject对象,其实是通过父类来传递它本身
再如
我们经常用
form1.components[i] as tbutton来操作一个对象,这里也是多态性的一个例子,在tcomponent中也有不少的抽象类
abstract类似于接口,只有声明没有定义,在多次被继承时有非常大的作用
一般写组件可以不考虑用这个关键字
一点愚见
override;
>>>>>>procedure Insert(Index: Integer; const S: string); virtual; abstract;
它本身不能被实例化,只有继承类对它继承后才能实例;
这就是多态性的优点
比如TButton1.Onclick(Sender:TObject);
这里的Sender初看是TObject对象,其实是通过父类来传递它本身
再如
我们经常用
form1.components[i] as tbutton来操作一个对象,这里也是多态性的一个例子,在tcomponent中也有不少的抽象类
abstract类似于接口,只有声明没有定义,在多次被继承时有非常大的作用
一般写组件可以不考虑用这个关键字
一点愚见
#3
抽象类被定义为abstract的方法,在它的子类里面必须被实现
#4
对于第二点qiubolecn的结论很有价值。
>>>>>>>>>比如TButton1.Onclick(Sender:TObject);
这里的Sender初看是TObject对象,其实是通过父类来传递它本身
这段话很难明白。不理解。能进一步说明吗。对于Sender 的用法,我原来只是看人家怎么写就怎么写,没有自己真正理解消化。
>>>>>>>>>比如TButton1.Onclick(Sender:TObject);
这里的Sender初看是TObject对象,其实是通过父类来传递它本身
这段话很难明白。不理解。能进一步说明吗。对于Sender 的用法,我原来只是看人家怎么写就怎么写,没有自己真正理解消化。
#5
抽象类的东西可以不予实现,也就是相当于一种协议
这也正是COM的基石
c++不正是用virutal void fun()=0;这种来弄com吗
只是产生一个virtual table,并占其位置
在delphi中interface关键子下声明的方法其实就是这种抽象虚拟方法
<<delphi com 深入编程>>说的
是接口使用者和接口实现者之间的一种协议
而Sender看看Click源代码
procedure TControl.Click;
begin
{ Call OnClick if assigned and not equal to associated action's OnExecute.
If associated action's OnExecute assigned then call it, otherwise, call
OnClick. }
if Assigned(FOnClick) and (Action <> nil) and (@FOnClick <> @Action.OnExecute) then
FOnClick(Self)
else if not (csDesigning in ComponentState) and (ActionLink <> nil) then
ActionLink.Execute(Self)
else if Assigned(FOnClick) then
FOnClick(Self);
end;
Click为Dynamic方法,被WMLButtonUp调用
procedure TControl.WMLButtonUp(var Message: TWMLButtonUp);
begin
inherited;
if csCaptureMouse in ControlStyle then MouseCapture := False;
if csClicked in ControlState then
begin
Exclude(FControlState, csClicked);
if PtInRect(ClientRect, SmallPointToPoint(Message.Pos)) then Click;
end;
DoMouseUp(Message, mbLeft);
end;
所以Sender也就是Button1的实例指针
Button2.OnClick(Sender: TObject)就是Button2的实例指针
Form1.OnClick(Sender: TObject)就是Form1实例指针
这也正是COM的基石
c++不正是用virutal void fun()=0;这种来弄com吗
只是产生一个virtual table,并占其位置
在delphi中interface关键子下声明的方法其实就是这种抽象虚拟方法
<<delphi com 深入编程>>说的
是接口使用者和接口实现者之间的一种协议
而Sender看看Click源代码
procedure TControl.Click;
begin
{ Call OnClick if assigned and not equal to associated action's OnExecute.
If associated action's OnExecute assigned then call it, otherwise, call
OnClick. }
if Assigned(FOnClick) and (Action <> nil) and (@FOnClick <> @Action.OnExecute) then
FOnClick(Self)
else if not (csDesigning in ComponentState) and (ActionLink <> nil) then
ActionLink.Execute(Self)
else if Assigned(FOnClick) then
FOnClick(Self);
end;
Click为Dynamic方法,被WMLButtonUp调用
procedure TControl.WMLButtonUp(var Message: TWMLButtonUp);
begin
inherited;
if csCaptureMouse in ControlStyle then MouseCapture := False;
if csClicked in ControlState then
begin
Exclude(FControlState, csClicked);
if PtInRect(ClientRect, SmallPointToPoint(Message.Pos)) then Click;
end;
DoMouseUp(Message, mbLeft);
end;
所以Sender也就是Button1的实例指针
Button2.OnClick(Sender: TObject)就是Button2的实例指针
Form1.OnClick(Sender: TObject)就是Form1实例指针
#6
>>>>>>>>>比如TButton1.Onclick(Sender:TObject);
这里的Sender初看是TObject对象,其实是通过父类来传递它本身
这段话很难明白。不理解。能进一步说明吗。对于Sender 的用法,我原来只是看人家怎么写就怎么写,没有自己真正理解消化。
OOP的多态性就是指父类可以有多个子类,而这些子类的对象都可以赋值给父类的对象
例如:
TA = class;
TB = class(TA)
...
end;
TC = class(TA)
...
end;
...
var
A: TA;
假设B是TB的对象,C是TC的对象,那么就可以把这两个对象赋给A
TObject是所有类的祖先,所以Sender: TObject可以是任何对象
这里的Sender初看是TObject对象,其实是通过父类来传递它本身
这段话很难明白。不理解。能进一步说明吗。对于Sender 的用法,我原来只是看人家怎么写就怎么写,没有自己真正理解消化。
OOP的多态性就是指父类可以有多个子类,而这些子类的对象都可以赋值给父类的对象
例如:
TA = class;
TB = class(TA)
...
end;
TC = class(TA)
...
end;
...
var
A: TA;
假设B是TB的对象,C是TC的对象,那么就可以把这两个对象赋给A
TObject是所有类的祖先,所以Sender: TObject可以是任何对象
#7
什么时候我才能搞懂这些问题呢??
学习!!!!!
学习!!!!!
#8
Abstract必须紧跟在virtual,dynamic或override指示字后面。
#1
关注!
#2
>>>>>问题出现了。子类中使用方法名称与父类〔再父类〕的方法名相同而参数不同时,后缀应该是什么呢?
override;
>>>>>>procedure Insert(Index: Integer; const S: string); virtual; abstract;
它本身不能被实例化,只有继承类对它继承后才能实例;
这就是多态性的优点
比如TButton1.Onclick(Sender:TObject);
这里的Sender初看是TObject对象,其实是通过父类来传递它本身
再如
我们经常用
form1.components[i] as tbutton来操作一个对象,这里也是多态性的一个例子,在tcomponent中也有不少的抽象类
abstract类似于接口,只有声明没有定义,在多次被继承时有非常大的作用
一般写组件可以不考虑用这个关键字
一点愚见
override;
>>>>>>procedure Insert(Index: Integer; const S: string); virtual; abstract;
它本身不能被实例化,只有继承类对它继承后才能实例;
这就是多态性的优点
比如TButton1.Onclick(Sender:TObject);
这里的Sender初看是TObject对象,其实是通过父类来传递它本身
再如
我们经常用
form1.components[i] as tbutton来操作一个对象,这里也是多态性的一个例子,在tcomponent中也有不少的抽象类
abstract类似于接口,只有声明没有定义,在多次被继承时有非常大的作用
一般写组件可以不考虑用这个关键字
一点愚见
#3
抽象类被定义为abstract的方法,在它的子类里面必须被实现
#4
对于第二点qiubolecn的结论很有价值。
>>>>>>>>>比如TButton1.Onclick(Sender:TObject);
这里的Sender初看是TObject对象,其实是通过父类来传递它本身
这段话很难明白。不理解。能进一步说明吗。对于Sender 的用法,我原来只是看人家怎么写就怎么写,没有自己真正理解消化。
>>>>>>>>>比如TButton1.Onclick(Sender:TObject);
这里的Sender初看是TObject对象,其实是通过父类来传递它本身
这段话很难明白。不理解。能进一步说明吗。对于Sender 的用法,我原来只是看人家怎么写就怎么写,没有自己真正理解消化。
#5
抽象类的东西可以不予实现,也就是相当于一种协议
这也正是COM的基石
c++不正是用virutal void fun()=0;这种来弄com吗
只是产生一个virtual table,并占其位置
在delphi中interface关键子下声明的方法其实就是这种抽象虚拟方法
<<delphi com 深入编程>>说的
是接口使用者和接口实现者之间的一种协议
而Sender看看Click源代码
procedure TControl.Click;
begin
{ Call OnClick if assigned and not equal to associated action's OnExecute.
If associated action's OnExecute assigned then call it, otherwise, call
OnClick. }
if Assigned(FOnClick) and (Action <> nil) and (@FOnClick <> @Action.OnExecute) then
FOnClick(Self)
else if not (csDesigning in ComponentState) and (ActionLink <> nil) then
ActionLink.Execute(Self)
else if Assigned(FOnClick) then
FOnClick(Self);
end;
Click为Dynamic方法,被WMLButtonUp调用
procedure TControl.WMLButtonUp(var Message: TWMLButtonUp);
begin
inherited;
if csCaptureMouse in ControlStyle then MouseCapture := False;
if csClicked in ControlState then
begin
Exclude(FControlState, csClicked);
if PtInRect(ClientRect, SmallPointToPoint(Message.Pos)) then Click;
end;
DoMouseUp(Message, mbLeft);
end;
所以Sender也就是Button1的实例指针
Button2.OnClick(Sender: TObject)就是Button2的实例指针
Form1.OnClick(Sender: TObject)就是Form1实例指针
这也正是COM的基石
c++不正是用virutal void fun()=0;这种来弄com吗
只是产生一个virtual table,并占其位置
在delphi中interface关键子下声明的方法其实就是这种抽象虚拟方法
<<delphi com 深入编程>>说的
是接口使用者和接口实现者之间的一种协议
而Sender看看Click源代码
procedure TControl.Click;
begin
{ Call OnClick if assigned and not equal to associated action's OnExecute.
If associated action's OnExecute assigned then call it, otherwise, call
OnClick. }
if Assigned(FOnClick) and (Action <> nil) and (@FOnClick <> @Action.OnExecute) then
FOnClick(Self)
else if not (csDesigning in ComponentState) and (ActionLink <> nil) then
ActionLink.Execute(Self)
else if Assigned(FOnClick) then
FOnClick(Self);
end;
Click为Dynamic方法,被WMLButtonUp调用
procedure TControl.WMLButtonUp(var Message: TWMLButtonUp);
begin
inherited;
if csCaptureMouse in ControlStyle then MouseCapture := False;
if csClicked in ControlState then
begin
Exclude(FControlState, csClicked);
if PtInRect(ClientRect, SmallPointToPoint(Message.Pos)) then Click;
end;
DoMouseUp(Message, mbLeft);
end;
所以Sender也就是Button1的实例指针
Button2.OnClick(Sender: TObject)就是Button2的实例指针
Form1.OnClick(Sender: TObject)就是Form1实例指针
#6
>>>>>>>>>比如TButton1.Onclick(Sender:TObject);
这里的Sender初看是TObject对象,其实是通过父类来传递它本身
这段话很难明白。不理解。能进一步说明吗。对于Sender 的用法,我原来只是看人家怎么写就怎么写,没有自己真正理解消化。
OOP的多态性就是指父类可以有多个子类,而这些子类的对象都可以赋值给父类的对象
例如:
TA = class;
TB = class(TA)
...
end;
TC = class(TA)
...
end;
...
var
A: TA;
假设B是TB的对象,C是TC的对象,那么就可以把这两个对象赋给A
TObject是所有类的祖先,所以Sender: TObject可以是任何对象
这里的Sender初看是TObject对象,其实是通过父类来传递它本身
这段话很难明白。不理解。能进一步说明吗。对于Sender 的用法,我原来只是看人家怎么写就怎么写,没有自己真正理解消化。
OOP的多态性就是指父类可以有多个子类,而这些子类的对象都可以赋值给父类的对象
例如:
TA = class;
TB = class(TA)
...
end;
TC = class(TA)
...
end;
...
var
A: TA;
假设B是TB的对象,C是TC的对象,那么就可以把这两个对象赋给A
TObject是所有类的祖先,所以Sender: TObject可以是任何对象
#7
什么时候我才能搞懂这些问题呢??
学习!!!!!
学习!!!!!
#8
Abstract必须紧跟在virtual,dynamic或override指示字后面。