我的类型声明为:
TPlayer = class(TObject)
TBullet = class(TObject)
TEnemy = class(TObject)
和对象:
Player: TPlayer;
PlayerBullets: Array[1..20] of TBullet;
Enemies: Array[1..20] of TEnemy;
EnemyBullets: Array[1..20] of TBullet;
现在,我要创建TBullet构造函数,该构造函数可以处理来自播放器和敌人的信息。简而言之,我希望此构造函数同时处理TPlayer和TEnemy对象。
我的想法是:
constructor TBullet.Create(const Source: TObject);
可悲的是,它不起作用。怎么做?
编辑:我的确切问题是:当我将TPlayer或TEnemy对象传递给此构造函数时,它看不到这些对象的属性。例如:TPlayer具有attr xPos。如果我使用Bullet.Create(Player)并在TBullet.Create中使用Source.xPos,则会出现错误。
我可以想到3种方法来实现。
我是说:
constructor TBullet.Create(const Source: TObject);
var
vPlayer : TPlayer;
vEnemy : TEnemy;
begin
if Source is TPlayer then
begin
vPlayer := TPlayer(Source);
[Do whatever with vPlayer]
end else if Source is TEnemy then
begin
vEnemy := TEnemy(Source);
[Do Whatever with vEnemy]
end;
end;
哪种解决方案是最好的?那本身可能是一场辩论,很大程度上取决于您的具体情况。仅根据您的班级名称,我猜选项1可能是有效的。可以创建一个“ TCharacter”类,并将其用作TCharacter和TEnemy的基本函数。但这只是猜测。
在Windows中,使用通用方法从父对象继承(可以在父对象中抽象)或实现接口(再次可以自定义行为)几乎没有什么区别。如果您有枚举commonParticipant(cpPlayer,cpEnemy),则Windows允许访问最终的父IUnknown,然后再次访问子接口,该子接口标识该子进程特有的方法,即,您可以传递包含commonParticipant的ICommonParticipant,然后与iPlayer或IEnemy界面