[Java]Вопрос

771
5
У меня есть три класса. A, B и C. В классе А мне нужно вызвать метод super из класса C, не вызывая при это super из B.
Можно как-то так сделать?
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
1 Если ты имел ввиду, что древо такое A <- B <- C <- Object, то так и скажи.
2 Есоли я прав, то мооооооооожет быть(не уверен, вряд-ли), super.super.method()?
 
771
5
anti344 написал(а):
1 Если ты имел ввиду, что древо такое A <- B <- C <- Object, то так и скажи.
2 Есоли я прав, то мооооооооожет быть(не уверен, вряд-ли), super.super.method()?
1. Да, именно так.
2. Неа, не пашет.
 
1,990
18
105
Нет. Нельзя вызывать родительские методы других объектов. Это, по сути, нарушает инкапсуляцию. Например, можно изменить у коллекции метод add, который фильтрует данные. Но если бы можно было избежать этого простым преобразованием видов или обращением к родителю - толку было бы ноль.
Следовательно super.super - такого нет, компилятор просто будет ругаться.
Хотя в С++ такое разрешено. (Не супер.супер, а преобразование типов)
Тут только создавать отдельный метод в классе B, который будет вызывать нужный метод, но уже не свой, а родителя.
 
771
5
У меня вот такая ситуация:
В классе EntityMob есть такой метод. Он добавляет своего и вызывает super.

Код:
public void onUpdate(){
    super.onUpdate();
    if (!worldObj.isRemote && worldObj.difficultySetting == 0){
            this.setDead();
    }
}
Мне нужно его обойти(чтобы мой моб не умирал при мирной сложности, но он должен все равно быть агрессивным и наследовать EntityMob), то есть вызвать super из EntityLiving.
 
1,990
18
105
Код:
public Method getMethod(Class<?> c, String name) throws NoSuchFieldException {
  try { 
    return c.getDeclaredMethod(name, new Class[] {});
  }
  catch (NoSuchMethodException exc) {
    if (c == Object.class) {
      throw exc;
    }
    return getMethod(c.getSuperclass());
  }
}
<...>
void somewhere() {
  try {
    getMethod(EntityLiving.class, "onUpdate").invoke(myEntity, new Object[] {});
  } 
  catch (IllegalArgumentException e) {} 
  catch (IllegalAccessException e) {} 
  catch (InvocationTargetException e) {
  }
}
-----
EDIT:
Хотя есть подозрения, что всё тщетно.
 
771
5
Сделал так:

Код:
try{
    EntityLiving.class.getDeclaredMethod("onUpdate", new Class[]{}).invoke(this, new Object[]{});
}catch(NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e){
    e.printStackTrace();
}
Фпс очень сильно проседает и оно не пашет...
 
1,990
18
105
Чтобы не проседал фпс - очевидно, сохраняй этот метод. Нельзя же его каждый тик доставать. При инициализации загрузил - потом делаешь invoke напрямую.
А насчет работоспособности было предсказуемо, ну что, я попытался всё же. 
Джаве, видимо, совсем не нравится игнорить перезаписанные чайлдами методы.
 
771
5
Oldestkon написал(а):
Чтобы не проседал фпс - очевидно, сохраняй этот метод. Нельзя же его каждый тик доставать. При инициализации загрузил - потом делаешь invoke напрямую.
А насчет работоспособности было предсказуемо, ну что, я попытался всё же. 
Джаве, видимо, совсем не нравится игнорить перезаписанные чайлдами методы.
Пичально(
 

necauqua

когда-то был anti344
Администратор
1,216
27
172
Вот путаете FPS и TPS. А проседает то в этом случае TPS.
 
Сверху