Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Dismiss Notice

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

Discussion in 'Разработка плагинов для новичков' started by wildbober, Mar 7, 2017.

  1. Автор темы
    wildbober

    wildbober Участник Пользователь

    Trophy Points:
    31
    Здравствуйте, у меня есть 2 класса: Mainclass and Start
    в Mainclass есть такие строчки -


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

    а ели так
    Code:
    public class Start  implements Listener {
    //kod
    }
    то нету того что было объявлено в Mainclass/
    можете подсказать как быть?
     
  2. Хостинг MineCraft
    <
  3. OsipXD

    OsipXD Старожил Пользователь

    Trophy Points:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    А зачем так ухищряться? Пусть onEnable будет в Start'e? а то получается какое-то безобразие с созданием экземпляра дочернего класса из родительского.
     
    Last edited: Mar 7, 2017
  4. AtomicInteger

    AtomicInteger Активный участник Пользователь

    Trophy Points:
    46
    То есть ухищряться?Отделение контроллера от модели - нормальная практика.Или ты предпочитаешь классы в 1000 строк?
    По теме, автор, что именно должно быть доступно в классе Starter из класса Mainclass?Может mainInstance в конструкторе поможет?
     
  5. OsipXD

    OsipXD Старожил Пользователь

    Trophy Points:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    Путаете сладкое с квадратным.
    Как можно говорить об MVC, если тут совершенно неясен контекст?
     
  6. AtomicInteger

    AtomicInteger Активный участник Пользователь

    Trophy Points:
    46
    Принцип примерно тот же, создание классов-обработчиков и их регистрация в главном классе, вместо того, что бы лепить методы разного назначения в один класс.
     
  7. OsipXD

    OsipXD Старожил Пользователь

    Trophy Points:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    А как это относится к текущей теме? Тут про наследование речь идет.
     
  8. AtomicInteger

    AtomicInteger Активный участник Пользователь

    Trophy Points:
    46
    Какое наследование?Я так понимаю, автору нужно получить ресурсы из главного класса, это можно сделать с помощью экземпляра этого главного класса.
     
  9. Автор темы
    wildbober

    wildbober Участник Пользователь

    Trophy Points:
    31
    Можешь подсказать как сделать экземпляр главного класса?
     
  10. AtomicInteger

    AtomicInteger Активный участник Пользователь

    Trophy Points:
    46
    В классе Start пишешь:
    Code:
    private Mainclass main;
      
    public Start(Mainclass mainInstance) {
        this.main = mainInstance;
    }
    В классе Mainclass пишешь:
    Code:
    public void onEnable() {
        Bukkit.getPluginManager().registerEvents(this, this);
        Bukkit.getPluginManager().registerEvents(new Start(this), this);    
    }
     
  11. Автор темы
    wildbober

    wildbober Участник Пользователь

    Trophy Points:
    31
    вписал как ты и сказал
    Code:
    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 подчеркивает красным типо их не находит.
     
  12. OsipXD

    OsipXD Старожил Пользователь

    Trophy Points:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    Если экземпляр главного класса нужно будет использовать не только в классе Start, то лучше реализовать паттерн Singleton в главном классе:
    Code:
    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()[DOUBLEPOST=1488918542,1488918320][/DOUBLEPOST]
    Да, потому что эти поля находятся в классе Mainclass и к ним нельзя обратиться напрямую из класса Start. Только если через оператор доступа ".", например main.defendsplayers.createNewFile(); (но это нарушает инкапсуляцию), либо, что более правильно, сделать эти поля приватными и получать их через геттер.

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

    P.S. Вам неплохо было бы подтянуть Джаву. Если интересно, могу скинуть в ЛС книжки.
     
  13. Автор темы
    wildbober

    wildbober Участник Пользователь

    Trophy Points:
    31
    Можешь про метод поподробнее рассказать?
     
  14. OsipXD

    OsipXD Старожил Пользователь

    Trophy Points:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    Про какой, getInstance()?
     
  15. Автор темы
    wildbober

    wildbober Участник Пользователь

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

    AtomicInteger Активный участник Пользователь

    Trophy Points:
    46
    main.defendsplayers и main.anarxplayers
     
  17. Автор темы
    wildbober

    wildbober Участник Пользователь

    Trophy Points:
    31
    тогда подчеркивает красным, к примеру, createNewFile()
     
  18. OsipXD

    OsipXD Старожил Пользователь

    Trophy Points:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    Зачем людей плохому учить)


    Стоп, а ведь onEnable должен быть в главном классе плагина.
     
  19. AtomicInteger

    AtomicInteger Активный участник Пользователь

    Trophy Points:
    46
    Тут, как видишь, стоит объяснить так, что бы буквочек поменьше было.Рассказывать про инкапсуляцию на данном этапе это как крышу без дома строить.
     
  20. Автор темы
    wildbober

    wildbober Участник Пользователь

    Trophy Points:
    31
    Так ведь подчеркивает то что у меня есть в главном классе, а в start нету... когда я так делал
     
  21. AtomicInteger

    AtomicInteger Активный участник Пользователь

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

Share This Page