Лекция 2: ООП в моддинге
Наследование, super, конструкторы, @Override, вложенные классы
ООП в Java на примерах из моддинга. Пригодится, когда начнёте делать свои предметы и блоки.
Наследование (extends)
Один класс может взять все методы и свойства другого:
public class PinkyliteStaffItem extends Item {
// получает все методы Item: use(), getRarity(), getMaxStackSize()
}
Без extends Item класс не связан с Minecraft и предмет не появится в игре.
В моддинге почти всё строится на наследовании. Свой предмет — extends Item. Свой блок — extends Block. Свой моб — extends Mob.
super
Вызов родительского класса. В конструкторах через super() передают параметры наверх:
public PinkyliteStaffItem(Item.Properties properties) {
super(properties); // вызывает конструктор Item
}
Без super(properties) родитель не получит настройки и предмет не будет работать.
Конструкторы
Метод, который запускается при создании объекта. Имя всегда совпадает с классом:
public class PinkyliteStaffItem extends Item {
public PinkyliteStaffItem(Item.Properties properties) {
super(properties); // передаём настройки родителю (Item)
}
}
В IntelliJ IDEA: встаньте внутри класса → Alt + Insert → Constructor.
@Override
Говорит компилятору: "я переопределяю метод родительского класса":
@Override
public InteractionResultHolder<ItemStack> use(Level level, Player player, InteractionHand hand) {
// своя логика вместо стандартной
}
Если убрать @Override и ошибиться в имени метода, Java молча создаст новый метод вместо переопределения. С аннотацией компилятор сразу скажет, что такого метода у родителя нет.
Вложенные классы (static class)
Класс внутри другого класса. В моддинге так группируют обработчики клиентских событий:
@Mod(RinovaMod.MOD_ID)
public class RinovaMod {
// ... основной код мода ...
@Mod.EventBusSubscriber(modid = MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT)
public static class ClientModEvents {
@SubscribeEvent
public static void onClientSetup(FMLClientSetupEvent event) {
}
}
}
ClientModEvents живёт внутри RinovaMod, но помечен static, поэтому не зависит от экземпляра мода. Forge находит его по аннотации @EventBusSubscriber и подключает автоматически.