继承类到程序的Pascal传递对象

问题描述 投票:0回答:2

我的类型声明为:

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,则会出现错误。

lazarus freepascal
2个回答
3
投票

我可以想到3种方法来实现。

  1. 具有TPlayer和TEnemy都从同一个基类派生,该基类具有TBullet的构造函数所需的所有信息,并具有该类型的构造函数参数。
  2. 定义一个接口,包含TBullet所需的所有信息,并让TPlayer和TEnemy实现该接口
  3. [保留所有内容,并在TBullet的构造函数中以“硬编码”方式管理不同的类。

我是说:

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的基本函数。但这只是猜测。


0
投票

在Windows中,使用通用方法从父对象继承(可以在父对象中抽象)或实现接口(再次可以自定义行为)几乎没有什么区别。如果您有枚举commonParticipant(cpPlayer,cpEnemy),则Windows允许访问最终的父IUnknown,然后再次访问子接口,该子接口标识该子进程特有的方法,即,您可以传递包含commonParticipant的ICommonParticipant,然后与iPlayer或IEnemy界面

© www.soinside.com 2019 - 2024. All rights reserved.