Pascal 将继承对象 class 传递给过程

Pascal passing object of inheritance class to procedure

我的类型声明为:

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 构造函数,它可以处理来自 Player 和 Enemies 的信息。简而言之,我希望此构造函数同时处理 TPlayer 和 TEnemy 对象。

我的想法是:

constructor TBullet.Create(const Source: TObject);

遗憾的是它不起作用。如何做到这一点?

编辑: 我的确切问题是:当我将 TPlayer 或 TEnemy 对象传递给此构造函数时,它看不到这些对象的属性。例如:TPlayer 具有 attr xPos。如果我使用 Bullet.Create(Player) 而在 TBullet.Create 中我使用 Source.xPos 我会得到一个错误。

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

  1. 让 TPlayer 和 TEnemy 都派生自同一个基础 class,拥有 TBullet 的构造函数需要的所有信息,并具有该类型的构造函数参数。
  2. 定义一个包含 TBullet 所需的所有信息的接口,并让 TPlayer 和 TEnemy 实现该接口
  3. 保留所有内容 "as is" 并在 TBullet 的构造函数中以 "hard coded" 的方式管理不同的 class。

我的意思是:

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;

哪种解决方案最好?这本身就是一场辩论,很大程度上取决于您的具体情况。仅根据您 class 的名称,我猜选项 1 可能有效。可以创建 "TCharacter" class 并将其用作 TCharacter 和 TEnemy 的基础类。但这只是目前的猜测。

在 windows 中,从具有通用方法的父级继承(在父级中可以是抽象的)或实现接口(再次可以自定义行为时)几乎没有区别。 如果您有一个枚举 commonParticipant( cpPlayer, cpEnemy) 那么 Windows 允许访问最终父 IUnknown 然后再次向下访问一个子接口,该接口标识该子接口特有的方法,即您可以传递一个 ICommonParticipant 包括 commonParticipant然后使用 iPlayer 或 IEnemy 界面