2013-12-06 2 views
0

У меня есть класс под названием CreatureAi со следующим кодом.Наследование, вызывающее ошибки с конструкторами?

public class CreatureAi { 
    public Creature creature; 

    public CreatureAi(Creature creature) { 
     this.creature = creature; 
     this.creature.setCreatureAi(this); 
    } 
    // There's more, I'm shortening it. 

У меня есть класс под названием PlayerAi, который его расширяет.

public class PlayerAi extends CreatureAi { 
    private FieldOfView fov; 
    private Player player; 

    public PlayerAi(Player player, FieldOfView fov) { 
     this.player = player; 
     this.player.setCreatureAi(this); 
     this.fov = fov; 
    } 
    // These are the only constructors. 

Однако Netbeans дает мне эту ошибку.

constructer CreatureAi in class CreatureAi cannot be applied to the given types. 
required: Creature 
found: No arguements 
reason: Actual and formal lists differ in length. 

Почему я получаю эту ошибку?

+5

'супер (существо)' в первой строке, не конструктор без-арг в CreatureAi – nachokk

+0

@nachokk Где я пишу супер (существо)? –

+1

Проверьте ссылку на язык Java по поводу построения объекта: http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.4 –

ответ

3

Когда вы пишете свой подкласс, неявные вызовы super(), которые находятся в конструкторе супер-типа.

public PlayerAi(Player player, FieldOfView fov) { 
     super(); // this call "father" constructor 
     this.player = player; 
     this.player.setCreatureAi(this); 
     this.fov = fov; 
} 

Как показать в своем коде, ваш базовый класс не имеет no-arg конструктор. Таким образом, ваш ребенок недействителен. Вы должны вызвать один действительный супер конструктор.

public PlayerAi(Player player, FieldOfView fov) { 
      super(//??creature); // you have to pass something here 
      this.player = player; 
      this.player.setCreatureAi(this); 
      this.fov = fov; 
    } 

Альтернатива, если вы можете изменить ваш CreatureAi, вы можете добавить по умолчанию нет-арг-конструктор.

public class CreatureAi { 
    private Creature creature; 

    public CreatureAi(){} 

    public CreatureAi(Creature creature) { 
     this.creature = creature; 
     this.creature.setCreatureAi(this); 
    } 
    // There's more, I'm shortening it. 
+0

Итак, мой дочерний класс автоматически вызывает мой родительский конструктор? –

+0

В принципе, вы должны иметь 'super (aPlayer, aFov)' в качестве первой инструкции в конструкторе 'PlayerAi' или создать конструктор no-arg для' CreatureAi'. –

+0

@AnubianNoob Всегда, поэтому, когда вы используете наследование, вы говорите, что ваш PlayerAi 'является' CreatureAi' – nachokk

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