2015-12-03 2 views
0

Я типы объявлены как:Pascal передавая объект класса наследования к процедуре

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); 

К сожалению, это не работает. Как это сделать?

EDIT: Моя конкретная проблема: когда я передаю объект TPlayer или TEnemy этому конструктору, он не видит атрибуты этих объектов. Например: TPlayer имеет attr xPos. Если я использую Bullet.Create (Player) и в TBullet.Create, я использую Source.xPos. Я получаю сообщение об ошибке.

+0

В каком смысле это не работает? Вы можете передавать экземпляры любого класса в 'TBullet.Create'. Если вам нужна помощь, вам нужно будет приложить больше усилий, чтобы объяснить вашу проблему, что вы хотите достичь, что вы пытались и как это произошло. –

ответ

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» может быть создан и использоваться как базовые calss для TCharacter и TEnemy. Но на этот раз это просто размышление.

+0

Большое спасибо. Хорошего дня. –

+1

Upvote для фактически наличия 3 решений. Четвертый, вероятно, что-то IDispatch основано :-) –

+0

@Viters см. Также https://sourcemaking.com/design_patterns/abstract_factory/delphi – xmojmr

 Смежные вопросы

  • Нет связанных вопросов^_^