2014-12-22 3 views
1

У меня есть класс, называемый Screen:Вызов переопределение функции подкласса от базового класса в AS3

public class Screen extends GameObject 
{ 
    //GameObject is a class extending Sprite and implemented by just some variables and methods 

    public static var scrStage:Stage; 

    public function Screen(argStage:Stage) { 
     scrStage = argStage; 
     initObjects(); 
    } 

    private function initObjects():void { 
     // empty method 
    } 

} 

и класс под названием экране воспроизведения:

public class PlayScreen extends Screen 
{ 
    //declares TextFields and GameObjects 

    public function PlayScreen(argStage:Stage) { 
     super(argStage); 
     //addChild those TextFields and GameObjects 
    } 

    private function initObjects():void { 
     // initializes those TextFields and GameObjects 
    } 

} 

}

Когда строится конструктор PlayScreen, Вызывается экранный конструктор. Внутри него scrStage присвоен argStage, initObjects() называется. экране воспроизведения (подкласс) 's initObjects() должен быть вызван, но Screen (базовый класс)' s initObjects() вызывается вместо.

Не могли бы вы помочь мне вызвать initObjects() при создании конструктора PlayScreen? Заранее спасибо.


UPDATE

К сожалению. После отладки где-то еще в моем проекте, я нашел решение этой:

//edit in Screen class 
private function initObjects():void {} 
//to 
protected function initObjects():void {} 
//or public 

//and in PlayScreen class 
private function initObjects():void {} 
//to 
protected override function initObjects():void {} 
//or public 
+0

initObjects() является частным методом и поэтому не наследуется. Нет причин для вызова версии PlayScreen при вызове версии суперкласса. Тот факт, что вам не пришлось переопределять его, должен был дать вам ключ. – BotMaster

ответ

1

Не могли бы вы просто не позвонить initObjects под экраном, так как это пустой метод так или иначе, и вызвать его из PlayScreen как таковой:

public class Screen extends GameObject 
{ 
    //GameObject is a class extending Sprite and implemented by just some variables and methods 

    public static var scrStage:Stage; 

    public function Screen(argStage:Stage) { 
     scrStage = argStage; 
    } 
} 

public class PlayScreen extends Screen 
{ 
    //declares TextFields and GameObjects 

    public function PlayScreen(argStage:Stage) { 
     super(argStage); 
     //addChild those TextFields and GameObjects 
     initObjects(); 
    } 

    private function initObjects():void { 
     // initializes those TextFields and GameObjects 
    } 

} 
+0

Неправильный ответ – BotMaster

+0

Я не согласен. Это альтернативный путь. Я это написал. Но я просто не хочу писать это в каждом классе, расширяя класс Screen. Спасибо за вашу помощь. –

+0

ли ваша инициализационная логика не изменится в каждом расширении экрана? Если бы они не изменились, то почему бы просто не реализовать на уровне экрана, если они меняются на основе расширения, однако я бы не видел пути вокруг него, кроме предоставления реализации под каждой расширенной версией класса – Kritner

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