C
cgzhang
Unregistered / Unconfirmed
GUEST, unregistred user!
欢迎参与讨论。
众所周知,Delphi中的重载(overload)有以下三点特征:
(1)所有的方法(method)有相同的名称;
(2)所有方法必须在参数的类型或数量上或两者均各不相同;
(3)函数的返回值不能用来区分重载的方法。
重载可以应用到全局过程(函数)和类方法中,但是在应用到类方法时,
情况变得复杂,原因是另外一个重要的概念“覆盖”(override)很容易和重载
相混淆,让我们看下面的例子:
Type
TAnimal=class
public
procedure voice;
end;
Type
TDog=classz(TAnimal)
public
procedure voice;
end;
在这样的情况下,方法voice到底是覆盖还是重载呢?
其实,这种情况既不是重载也不是覆盖,而仅仅是子类TDog的方法voice
“屏蔽”了父类TAnimal的voice方法,以下的阿代码才是真正的重载了方法voice;
Type
TAnimal=class
public
procedure voice;
end;
Type
TDog=classz(TAnimal)
public
procedure voiceverload;
end;
注意:在类重载中,父类的方法声明可以省略关键字overload。
以下是覆盖(override)的代码:
Type
TAnimal=class
public
procedure voice;virtual;//必须!
end;
Type
TDog=classz(TAnimal)
public
procedure voice;override;//必须!
end;
另外还有其他几种情况:
Type
TAnimal=class
public
procedure voice;virtual;
end;
Type
TDog=classz(TAnimal)
public
procedure voice;reintroduce;overrload;
end;
众所周知,Delphi中的重载(overload)有以下三点特征:
(1)所有的方法(method)有相同的名称;
(2)所有方法必须在参数的类型或数量上或两者均各不相同;
(3)函数的返回值不能用来区分重载的方法。
重载可以应用到全局过程(函数)和类方法中,但是在应用到类方法时,
情况变得复杂,原因是另外一个重要的概念“覆盖”(override)很容易和重载
相混淆,让我们看下面的例子:
Type
TAnimal=class
public
procedure voice;
end;
Type
TDog=classz(TAnimal)
public
procedure voice;
end;
在这样的情况下,方法voice到底是覆盖还是重载呢?
其实,这种情况既不是重载也不是覆盖,而仅仅是子类TDog的方法voice
“屏蔽”了父类TAnimal的voice方法,以下的阿代码才是真正的重载了方法voice;
Type
TAnimal=class
public
procedure voice;
end;
Type
TDog=classz(TAnimal)
public
procedure voiceverload;
end;
注意:在类重载中,父类的方法声明可以省略关键字overload。
以下是覆盖(override)的代码:
Type
TAnimal=class
public
procedure voice;virtual;//必须!
end;
Type
TDog=classz(TAnimal)
public
procedure voice;override;//必须!
end;
另外还有其他几种情况:
Type
TAnimal=class
public
procedure voice;virtual;
end;
Type
TDog=classz(TAnimal)
public
procedure voice;reintroduce;overrload;
end;