Помогите не работает если передаю ссылк на главный класс

wildbober

Участник
Пользователь
Баллы
31
Здравствуйте, у меня есть 2 класса: Mainclass and Start
в Mainclass есть такие строчки -


Код:
 public void onEnable() {
           Bukkit.getPluginManager().registerEvents(this, this);
           Bukkit.getPluginManager().registerEvents(new Start(), this);       
}
Последняя строчка, как я понимаю, слушает события в классе Start
а вот строчка из Start -
Код:
public class Start extends Mainclass  implements Listener {

//kod
}
вот так код вообще не выполняется.

а ели так
Код:
public class Start  implements Listener {
//kod
}
то нету того что было объявлено в Mainclass/
можете подсказать как быть?
 
А зачем так ухищряться? Пусть onEnable будет в Start'e? а то получается какое-то безобразие с созданием экземпляра дочернего класса из родительского.
 
Последнее редактирование:
А зачем так ухищряться? Пусть onEnable будет в Starter'e? а то получается какое-то безобразие с созданием дочернего класса из родительского.
То есть ухищряться?Отделение контроллера от модели - нормальная практика.Или ты предпочитаешь классы в 1000 строк?
По теме, автор, что именно должно быть доступно в классе Starter из класса Mainclass?Может mainInstance в конструкторе поможет?
 
То есть ухищряться?Отделение контроллера от модели - нормальная практика.Или ты предпочитаешь классы в 1000 строк?
По теме, автор, что именно должно быть доступно в классе Starter из класса Mainclass?Может mainInstance в конструкторе поможет?
Путаете сладкое с квадратным.
Как можно говорить об MVC, если тут совершенно неясен контекст?
 
Путаете сладкое с квадратным.
Как можно говорить об MVC, если тут совершенно неясен контекст?
Принцип примерно тот же, создание классов-обработчиков и их регистрация в главном классе, вместо того, что бы лепить методы разного назначения в один класс.
 
Принцип примерно тот же, создание классов-обработчиков и их регистрация в главном классе, вместо того, что бы лепить методы разного назначения в один класс.
А как это относится к текущей теме? Тут про наследование речь идет.
 
А как это относится к текущей теме? Тут про наследование речь идет.
Какое наследование?Я так понимаю, автору нужно получить ресурсы из главного класса, это можно сделать с помощью экземпляра этого главного класса.
 
Какое наследование?Я так понимаю, автору нужно получить ресурсы из главного класса, это можно сделать с помощью экземпляра этого главного класса.
Можешь подсказать как сделать экземпляр главного класса?
 
Можешь подсказать как сделать экземпляр главного класса?
В классе Start пишешь:
Java:
private Mainclass main;
  
public Start(Mainclass mainInstance) {
    this.main = mainInstance;
}
В классе Mainclass пишешь:
Java:
public void onEnable() {
    Bukkit.getPluginManager().registerEvents(this, this);
    Bukkit.getPluginManager().registerEvents(new Start(this), this);    
}
 
В классе Start пишешь:
Java:
private Mainclass main;

public Start(Mainclass mainInstance) {
    this.main = mainInstance;
}
В классе Mainclass пишешь:
Java:
public void onEnable() {
    Bukkit.getPluginManager().registerEvents(this, this);
    Bukkit.getPluginManager().registerEvents(new Start(this), this);  
}
вписал как ты и сказал
Код:
public class Start implements Listener {
  
     private Mainclass main;
     public Start(Mainclass mainInstance) {
            this.main = mainInstance;
        }
   
     public void onEnable() {
       
      
         if (!defendsplayers.exists()) {
               try {
                   defendsplayers.createNewFile();
              
            }
               catch (IOException e) {
                e.printStackTrace();
            }
               }
             
               if (!anarxplayers.exists()) {
               try {
                   anarxplayers.createNewFile();
              
            }
               catch (IOException e) {          
                e.printStackTrace();
            }
               }
       
     }
}
defendsplayers and anarxplayers подчеркивает красным типо их не находит.
 
Можешь подсказать как сделать экземпляр главного класса?
Если экземпляр главного класса нужно будет использовать не только в классе Start, то лучше реализовать паттерн Singleton в главном классе:
Java:
private static Mainclass instance;

public void onEnable() {
    instance = this;

    Bukkit.getPluginManager().registerEvents(this, this);
    Bukkit.getPluginManager().registerEvents(new Start(this), this);
}

public static Mainclass getInstance() {
    return instance;
}

И потом там где надо получить доступ к экземпляру главного класса, вызывать getInstance()
вписал как ты и сказал
Код:
public class Start implements Listener {

     private Mainclass main;
     public Start(Mainclass mainInstance) {
            this.main = mainInstance;
        }

     public void onEnable() {
  
 
         if (!defendsplayers.exists()) {
               try {
                   defendsplayers.createNewFile();
         
            }
               catch (IOException e) {
                e.printStackTrace();
            }
               }
        
               if (!anarxplayers.exists()) {
               try {
                   anarxplayers.createNewFile();
         
            }
               catch (IOException e) {     
                e.printStackTrace();
            }
               }
  
     }
}
defendsplayers and anarxplayers подчеркивает красным типо их не находит.
Да, потому что эти поля находятся в классе Mainclass и к ним нельзя обратиться напрямую из класса Start. Только если через оператор доступа ".", например main.defendsplayers.createNewFile(); (но это нарушает инкапсуляцию), либо, что более правильно, сделать эти поля приватными и получать их через геттер.

Или сделать публичный метод, который будет выполнять нужные действия с полями, и вызывать его.

P.S. Вам неплохо было бы подтянуть Джаву. Если интересно, могу скинуть в ЛС книжки.
 
Если экземпляр главного класса нужно будет использовать не только в классе Start, то лучше реализовать паттерн Singleton в главном классе:
Java:
private static Mainclass instance;

public void onEnable() {
    instance = this;

    Bukkit.getPluginManager().registerEvents(this, this);
    Bukkit.getPluginManager().registerEvents(new Start(this), this);
}

public static Mainclass getInstance() {
    return instance;
}

И потом там где надо получить доступ к экземпляру главного класса, вызывать getInstance()

Да, потому что эти поля находятся в классе Mainclass и к ним нельзя обратиться напрямую из класса Start. Только если через оператор доступа ".", например main.defendsplayers.createNewFile(); (но это нарушает инкапсуляцию), либо, что более правильно, сделать эти поля приватными и получать их через геттер.

Или сделать публичный метод, который будет выполнять нужные действия с полями, и вызывать его.

P.S. Вам неплохо было бы подтянуть Джаву. Если интересно, могу скинуть в ЛС книжки.
Можешь про метод поподробнее рассказать?
 
вписал как ты и сказал
Код:
public class Start implements Listener {
 
     private Mainclass main;
     public Start(Mainclass mainInstance) {
            this.main = mainInstance;
        }
  
     public void onEnable() {
      
     
         if (!defendsplayers.exists()) {
               try {
                   defendsplayers.createNewFile();
             
            }
               catch (IOException e) {
                e.printStackTrace();
            }
               }
            
               if (!anarxplayers.exists()) {
               try {
                   anarxplayers.createNewFile();
             
            }
               catch (IOException e) {         
                e.printStackTrace();
            }
               }
      
     }
}
defendsplayers and anarxplayers подчеркивает красным типо их не находит.
main.defendsplayers и main.anarxplayers
 
main.defendsplayers и main.anarxplayers
Зачем людей плохому учить)


Или сделать публичный метод, который будет выполнять нужные действия с полями, и вызывать его.
Стоп, а ведь onEnable должен быть в главном классе плагина.
 
Зачем людей плохому учить)



Стоп, а ведь onEnable должен быть в главном классе плагина.
Тут, как видишь, стоит объяснить так, что бы буквочек поменьше было.Рассказывать про инкапсуляцию на данном этапе это как крышу без дома строить.
 
Тут, как видишь, стоит объяснить так, что бы буквочек поменьше было.Рассказывать про инкапсуляцию на данном этапе это как крышу без дома строить.
Так ведь подчеркивает то что у меня есть в главном классе, а в start нету... когда я так делал
 
Так ведь подчеркивает то что у меня есть в главном классе, а в start нету... когда я так делал
В коде выше, что ты скинул, ты поместил метод onEnable в класс Start, хотя нужно было в Mainclass, так как главным является второй.Если ты хочешь получить поля/методы из класса Mainclass, то используй ссылку, которую ты создал с помощью кода выше.Примерно получиться так: main.methodFromMainClass(params);
 
Назад
Верх