Я пытаюсь разработать интерфейсы и классы для анализа некоторых типов пакетов внутри файла формата pcap. (Я знаю, что существуют специальные библиотеки, но мне нужно сделать это самостоятельно)Дженерики, необходимые для расширения/реализации этих интерфейсов?
Итак, у меня есть интерфейс классификатора, метод будет проверять, является ли он действительным пакетом.
public interface Classifier {
boolean classify (PcapPacket pcapPacket);
}
Метод интерфейса анализатор может преобразовать массив байтов внутри PcapPacket
в некоторых областях. P
означает новый анализируемый пакет и S
для статистики.
public interface Parser<P, S> extends Classifier {
P parsePacket (PcapPacket pcapPacket);
P parsePacket (PcapPacket pcapPacket, P outPacket);
S parseReader (PcapReader pcapReader);
}
Теперь я реализовал AParser
, который может анализировать определенный пакет или файл.
public class AParser implements Parser<APacket, AStats>, Classifier {
Но теперь у меня возникли трудности для реализации BParser
на вершине AParser
, учитывая, что BPacket extends APacket
.
public class BParser extends AParser implements Parser<BPacket, BStats> {
В parsePacket
я хочу сделать что-то вроде этого:
BPacket parsePacket (PcapPacket pcapPacket) {
APacket apacket = super.parse(pcapPacket);
BPacket bpacket = new BPacket(apacket);
//extract val1 and val2 from pcapPacket
bpacket.set(val1, val2);
return bpacket;
}
линии в смелой ошибке даяния компиляции. На данный момент я понял, что с моим подходом что-то не так. Вероятно, мне нужно использовать generics, когда я определяю интерфейсы.
Как вы мне поможете переделать этот код, чтобы он работал и гибким в будущем?
Моя первая мысль изменить Parser так, что она определена в терминах двух других интерфейсов, Packet и статистика, а не с точки зрения конкретных классов. Тогда не обязательно было бы быть общим, и APacket и BPacket и AStats и BStats просто должны были бы реализовать Packet и Stats. Но я не достаточно знаком с pcap, чтобы узнать, возможно ли это. –
@DavidConrad, но для пакета я не могу думать об обобщении. У них могут быть совершенно разные поля. –
Но есть ли у них и другое поведение? Просто потому, что они имеют разные внутренние элементы, это не значит, что они не могут реализовать один и тот же интерфейс (подумайте о ArrayList и LinkedList, которые оба реализуют List, с совершенно разными реализациями), но если они имеют разное поведение, то они не только не смогут реализовать тот же интерфейс, они не могут наследовать друг от друга! –