方法重引入(100分)

  • 主题发起人 主题发起人 swordman_ji
  • 开始时间 开始时间
S

swordman_ji

Unregistered / Unconfirmed
GUEST, unregistred user!
type
op=class
procedure ji;virtual;
end;
cr=class(op)
procedure ji(x:string);reintroduce;overload;
end;


1.我发现加上reintroduce;overload;没有什么作用
2.那加上reintroduce;overload;本意是想怎样的用处呢
3.我知道这叫'方法重引入',那'方法重引入'是怎样的一个概念
4.那加上reintroduce;或overload;其中一个行不行,
reintroduce;和overload;各发挥什么作用
5.它与普通的方法重载有什么不同
 
1.我发现加上reintroduce;overload;没有什么作用
---cr=class(op)
procedure ji(x:string);reintroduce;overload;
和父类里定义的不同(参数方面)
reintroduce当然没用
OVERLOAD和类基本不搭嘎.这个指示字不是面向对象语言的专利.

2.那加上reintroduce;overload;本意是想怎样的用处呢
reintroduce: 告诉编译器, 子类要用一个新的方法覆盖
父类的同名虚方法并且不要报任何不友好的信息如WARING/HINT之类的
overload: 重载(不是OVERRIDE)一个同名过程/函数或是对象方法
根据传入参数不同调用不同方法.
3.我知道这叫'方法重引入',那'方法重引入'是怎样的一个概念

4.那加上reintroduce;或overload;其中一个行不行,
reintroduce;和overload;各发挥什么作用
--见上面回答
5.它与普通的方法重载有什么不同
---得,
考一段帮助给你看看吧:
In the following example, the Draw method declared in TFigure is overridden in two descendant classes.

type

TFigure = class
procedure Draw
virtual;
end;
TRectangle = class(TFigure)
procedure Draw
override;
end;
TEllipse = class(TFigure)
procedure Draw
override;
end;

Given these declarations, the following code illustrates the effect of calling a virtual method through a variable whose actual type varies at runtime.

var

Figure: TFigure;
begin
Figure := TRectangle.Create;
Figure.Draw
// calls TRectangle.Draw
Figure.Destroy;
Figure := TEllipse.Create;
Figure.Draw
// calls TEllipse.Draw
Figure.Destroy;
end;

Only virtual and dynamic methods can be overridden. All methods, however, can be overloaded;
 
最简单的理解:
reintroduce: 将另一个类方法函数/过程取一个与这个类方法函数/过程相同的名字并
覆盖这个类方法函数/过程, 而且不引起编译器出现警告信息
overload: 将两个不同的函数/过程取成一样的函数/过程名, 编译器根据调用参数不同
决定具体运行时运行哪一个.

有上可知: 所有这些关键字都是为方便原代码阅读而产生的, 对最后产生的代码没有
任何影响.
 
reintroduce是有用的。
因为父类中有同名但不同参数结构的虚方法。
所以当在子类中定义一个同名但不同参数结构的(普通)方法时候,编译器会给出一个warning.
使用reintroduce修饰会告诉编译器,不用产生这个警告。

overload是为类cr的后代类中同名且相同参数结构但不同参数类型的方法重定义时作准备。
 
多人接受答案了。
 
后退
顶部