Pascal将继承类的对象传递给过程

时间:2015-12-03 17:41:11

标签: lazarus freepascal

我将类型声明为:

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(播放器)并在TBullet.Create中使用Source.xPos我收到错误。

2 个答案:

答案 0 :(得分:3)

我可以想出3种方法来实现这一点。

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

    NSNotification

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

答案 1 :(得分:0)

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