2012-05-14 8 views
1

現在、シリアル/デシリアス・データのようなコードがあります。 getFieldIDが実装されている方法が最善ではないように私は感じリファクタリング・タイプ・コードのオーバーライド

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; 
    } 
} 

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

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

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

+0

は私の答えを参照してください。 – nnhthuan

答えて

3

基本クラスのサブクラス固有の定数をリストすることは、理想的にはスーパークラスがそのサブクラスについて知っているべきではないため、理想的ではありません。ベースに定数をリストするだけで、と同じくらい悪くはありません。を使って、ベースクラスのコード内のサブクラスを区別します。

理想的には、定数をそれぞれのサブクラスに移動する必要があります。あなたがコンパイルを壊さずにそれを行うことができないなら、あなたは本当にリファクタリングのための主要な候補を見つけました。

+0

私は、あなたが衝突するフィールドIDに遭遇する可能性があるという問題があると思います。フィールドIDの一元化されたリストがないので、2つの別々のサブクラスで同じようにフィールドIDを宣言することになります。 – Brad

0

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

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

3

ジェネリックスでクラスを定義できます。このよう :それは何をしたいかどう

フィールド

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; 
    } 
} 
+0

ファイルからデータを読み戻すときに、正しい情報を読み取るためにどのオブジェクトを作成するかをどのように決定するのですか?ファイルには識別情報はありませんが、正しいのでしょうか? – Brad

+0

構造体を自分で定義して、ファイルの種類を識別することができます。 :) – nnhthuan

関連する問題