2016-08-23 3 views
-4

Я работаю над проектом и для удобства использования. Я хотел иметь возможность создать класс, расширяющий мой интерфейс «Экран», а класс экрана затем инициализируется из моего основного метода, например:Выполнение абстрактных методов из других классов

//Screen Interface 
public abstract interface Screen { 
    public abstract void init(); 
} 

//Screen Implementation 
public class Game implements Screen { 

    @Override 
    public void init() { 
     //Do stuff 
    } 
} 

//Main class 
public class Main { 

    public static void main(String[] args) { 
     Screen s = new Screen(); 
     s.init(); 
    } 
} 

Но это не работает, потому что вы не можете создать абстрактный класс. Я бы пробовал

Screen.init(); 

Но вы не можете называть метод подобным, если только его статический. Как я могу сделать то, что я пытаюсь достичь? Если бы я был недостаточно ясен, спросите в комментариях не просто флаг, и я обновлю свой вопрос.

EDIT: Я знаю, что могу создать экземпляр класса Game, но это не главное. Я пытаюсь запустить метод init в каждом классе, реализующем интерфейс экрана, поэтому мне не нужно указывать каждый из них.

+1

Также вы, похоже, путаетесь между интерфейсами и абстрактными классами –

+1

Я не вижу смысла в декларировании абстрактного интерфейса. Это уже так же, как и методы. По умолчанию общедоступны методы. Кроме того, вы не можете создавать абстрактные классы и интерфейсы. – Li357

+0

Скажите, что вы смогли сделать что-то вроде 'Screen.init();', какой подкласс должен инициализировать? Зачем? Это пахнет проблемой [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Просьба уточнить. –

ответ

2

почему не

Game s = new Game(); 
s.init(); 

или, возможно, если у вас есть на самом деле использовать для интерфейса Screen затем

Screen s = new Game(); 
s.init(); 

Кроме того, вы, кажется, путают между интерфейсами и абстрактными классами .. Вы определяете интерфейс. Вы не продлевают interfaces и вы не можете создать экземпляр interface

Если вы хотите init называться автоматически, то я предлагаю вам добавить его в качестве статического блока или вызвать его из вас super конструктор

+0

Поскольку я не хочу этого делать для каждой создаваемой игры, я хочу, чтобы она инициализировала все классы, реализующие класс Screen – Hamish

+1

Вы не можете @Hamish – Li357

+0

Это не очень хорошая практика иметь ссылку на подтип – amitmah

-1

Вам нужно создать экземпляр Game , а не экран.

+0

Это правильный ответ, но у него нет кода, и объяснение неясно – Li357

+0

Извините, Знаю, что это было правилом. Думал, что это было довольно прямо. Не беспокойся. –

+0

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

1

В вашем коде выше замените эту строку

Screen s = new Screen(); 

с этой линией:

Screen s = new Game(); 

Это будет работать из-за динамическое связывание/выполнение полиморфизма особенности Упса. Во время выполнения определяется объект, реализующий этот метод (init()).

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