0

pcap-format ファイル内の特定のタイプのパケットを解析するためのインターフェイスとクラスを設計しようとしています。(特別なライブラリが存在することは知っていますが、自分でやる必要があります)

したがって、分類子インターフェイスがあり、メソッドはそれが有効なパケットであるかどうかを確認します。

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た上で実装するのが困難です。AParserBPacket 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;
}

コンパイル エラーを示す太字の行。この時点で、私のアプローチに何か問題があることがわかりました。おそらく、インターフェイスを定義するときにジェネリックを使用する必要があります。

このコードを再設計して、将来的に機能し柔軟にするためにどのように手伝ってくれますか?

4

1 に答える 1

1

そうです、ジェネリックとサブクラスはそのようにうまく連携しません。汎用パラメーターを特定のオブジェクト (APacket) にバインドするパーサー (AParser) の特殊化を既に宣言しています。その後、この特殊化から、別の汎用パラメーターのセットを使用して拡張することはできません。あなたがこれをやろうとしているようです:

public class BParser implements Parser<APacket, AStats>, Parser<BPacket, BStats> {

タイプ消去は、同じシグネチャに変換されるメソッドがたくさんあることを意味するため、これは機能しません。より実行可能な解決策は、特殊なパーサーの共通機能を、汎用パラメーターを特定の型にバインドしない抽象基本クラスに押し込むことです。疑似コードで示す:

public abstract class BaseParser<P, S> implements Parser<P, S> {
    // common functionality here
}

public class AParser extends BaseParser<APacket, AStats> {
    // functionality specific to AParser
}

public class BParser extends BaseParser<BPacket, BStats> {
    // functionality specific to BParser
}
于 2013-03-12T05:40:10.527 に答える