2

現在、データをシリアライズ/デシリアライズするコードの一部があります。

クラス構造は次のようになります。

public class Field
{
    public abstract void writeField(DataOutputStream out);

    public abstract int getFieldID();

    ...

    protected static final int INT_FIELD = 1;
    protected static final int BOOL_FIELD = 2;

    ...

    public void write(DataOutputStream out)
    {
        out.writeInt(getFieldID());
        writeField(out);
    }

    ...
}

public class IntField extends Field
{
    public int v;

    public void writeField(DataOutputStream out)
    {
        out.writeInt(v);
    }

    public int getFieldID()
    {
        return Field.INT_FIELD;
    }
}

getFieldID の実装方法が最適ではないように感じます。

そのクラスの一意の識別子を返す抽象メソッドを記述するのは、悪臭のように感じます。

これを実装するためのより良い方法はありますか?

4

3 に答える 3

4

サブクラス固有の定数を基底クラスにリストすることは、理想的にはスーパークラスがそのサブクラスを認識しないようにする必要があるため、それほど優れたアイデアではありません。ベースに定数をリストするだけでも、それらを使用してベース クラスのコード内のサブクラスを区別するほど悪くはありません。

理想的には、定数をそれぞれのサブクラスに移動する必要があります。コンパイルを中断せずにそれを行うことができない場合は、実際にリファクタリングの最有力候補に出くわしたことになります。

于 2012-05-14T03:35:02.637 に答える
4

Generics を使用してクラスを定義できます。このような:

分野

import java.io.DataOutputStream;

public abstract class Field<T extends Object> {
    public abstract void writeField(DataOutputStream out);
    public abstract T getValue();
    public abstract Class<T> getFieldClass();
}

IntField

import java.io.DataOutputStream;
import java.io.IOException;

public class IntField extends Field<Integer> {
    public Integer v;

    @Override
    public void writeField(DataOutputStream out) {
        try {
            out.writeChars(v.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public Integer getValue() {
        return v;
    }

    @Override
    public Class<Integer> getFieldClass() {
        return Integer.class;
    }
}
于 2012-05-14T07:02:18.173 に答える
1

サブクラスでオーバーライドされるスーパークラスの抽象メソッドを使用して実装継承を使用する以外に、クラスを密結合にすることができます。

インターフェイスで宣言されたすべてのメソッドが実装クラスで実装される実装クラスに実装されるインターフェイスを持つことができます。このメソッドと継承のもう 1 つのフレーバーは、インターフェイス継承として知られています。これにより、スーパークラスとサブクラスの間の密結合が減少します。

于 2012-05-14T03:34:50.280 に答える