Java экземпляр чего-то мягко закодирован? - PullRequest
0 голосов
/ 19 июня 2019

У меня есть перечисление под названием PacketType.Затем у меня есть класс с именем Packet и класс DummyPacket, который расширяет Packet.

public class Packet {
}

public class DummyPacket extends Packet {
    public void handle() {
    }
}

. Мне нужен какой-то обработчик, такой, чтобы, когда я получаю какой-нибудь объектный пакет, я хочу вызвать handle() метод из -DummyPacket`.Есть ли какой-нибудь способ сделать это в мягком коде, или я должен сделать Packet instanceof DummyPacket для каждого класса, который расширяет пакет?

Я пытался использовать Class<?>.isInstance(), но это не помогло мне, потому что я не мог заставить Class<?> вызвать метод:

Я вроде бы хочу назвать его какthis:

открытый статический дескриптор void (пакетный пакет) {if (packet.getType (). clazz.isInstance (packet)) {packet.getType (). clazz.handle ();}}

1 Ответ

2 голосов
/ 19 июня 2019

Вы должны быть в состоянии сделать это следующим образом:

public void callHandle(Packet packet) {
  if (packet instanceof DummyPacket) {
    ((DummyPacket) packet).handle();
  }
}

[РЕДАКТИРОВАТЬ] После того, как ОП дал больше информации, оказалось, что он ищет способ, чтобы несколько классов имели метод ста же подпись.

То, что вы ищете, это интерфейсы.Взгляните на эти классы:

public class Packet { }
public interface Handleable {
  public void handle();
}

public class DummyPacket extends Packet implements Handleable {
  @Override
  public void handle() {
    // Do something
  }
}

public class OtherPacket extends Packet implements Handleable {
  @Override
  public void handle() {
    // Do something else
  }
}

public class LastPacket extends Packet { }

В этом примере у вас есть 3 класса, которые extend Packet класс:

  • DummyPacket
  • OtherPacket
  • LastPacket

Но только 2 класса, которые реализуют интерфейс Handleable:

  • DummyPacket
  • OtherPacket

Это означает, что вы можете проверить, есть ли у класса метод handle, например:

public void callHandle(Handeable someClass) {
  someClass.handle();
}

Теперь мы можем отфильтровать все классыкоторые не имеют handle метода.

Я предлагаю вам прочитать больше о наследовании , абстрактных классах и интерфейсах .

...