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 种方法来实现。
- 让 TPlayer 和 TEnemy 都派生自同一个基础 class,拥有 TBullet 的构造函数需要的所有信息,并具有该类型的构造函数参数。
- 定义一个包含 TBullet 所需的所有信息的接口,并让 TPlayer 和 TEnemy 实现该接口
- 保留所有内容 "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 界面
我的类型声明为:
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 种方法来实现。
- 让 TPlayer 和 TEnemy 都派生自同一个基础 class,拥有 TBullet 的构造函数需要的所有信息,并具有该类型的构造函数参数。
- 定义一个包含 TBullet 所需的所有信息的接口,并让 TPlayer 和 TEnemy 实现该接口
- 保留所有内容 "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 界面