Delphi的OOP概念方面的问题。分我有几K多。想要都给了也没关系。

时间:2022-10-09 04:46:43
Virtual方法及Dynamic方法大家一定了解吧。我就由这里开始我的问题。是一系列的呀。(1)我们把问题实例化一点。在Class.pas 中有一个对象TCollection对象中有一个方法constructor Create(Collection: TCollection); virtual; 
它的父类的父类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类似于接口,只有声明没有定义,在多次被继承时有非常大的作用
一般写组件可以不考虑用这个关键字


一点愚见

#3


抽象类被定义为abstract的方法,在它的子类里面必须被实现

#4


对于第二点qiubolecn的结论很有价值。

>>>>>>>>>比如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实例指针

#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可以是任何对象

#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类似于接口,只有声明没有定义,在多次被继承时有非常大的作用
一般写组件可以不考虑用这个关键字


一点愚见

#3


抽象类被定义为abstract的方法,在它的子类里面必须被实现

#4


对于第二点qiubolecn的结论很有价值。

>>>>>>>>>比如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实例指针

#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可以是任何对象

#7


什么时候我才能搞懂这些问题呢??
学习!!!!!

#8


Abstract必须紧跟在virtual,dynamic或override指示字后面。