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

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем wildbober, 7 мар 2017.

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

    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/
    можете подсказать как быть?
     
  2. Хостинг MineCraft
    <
  3. OsipXD

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Баллы:
    31
    вписал как ты и сказал
    Код:
    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 Старожил Пользователь

    Баллы:
    173
    Skype:
    osip.fatkullin
    Имя в Minecraft:
    OsipXD
    Если экземпляр главного класса нужно будет использовать не только в классе Start, то лучше реализовать паттерн Singleton в главном классе:
    Код:
    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 Участник Пользователь

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

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

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

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

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

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

    Баллы:
    46
    main.defendsplayers и main.anarxplayers
     
  17. Автор темы
    wildbober

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

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

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

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


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

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

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

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

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

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

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

Поделиться этой страницей