2010-12-14 25 views
1

私は親クラスを持っています。問題は、一般化したい静的メソッドがあることです。これを行うベストプラクティスは何ですか?私はいくつかの解決策を考え出しましたが、すべて静的メソッドでは機能しません。静的メソッドの継承

抽象メソッドを実装するためにchildobjectを強制する方法はありますか?

親クラス:

public class Data_object { 

    public byte[] toByteArray() throws IOException { 
     return null; 
    } 
    public static Data_object fromByteArray(byte[] data){ 
     return null 
    } 
} 

子供クラス:

public class ModelObject extends Data_object { 

    public static Data_object fromByteArray(byte[] data){ 
     ModelObject result = new ModelObject(); 
     //set data from byte arrray 
     return result; 
    } 
} 

おかげ

+2

この場合、メソッドを静的にしたいのはなぜですか? –

+0

静的メソッド抽象メソッドを呼び出すときに呼び出すメソッドの正確なクラスを指定する必要があるため、静的メソッド抽象メソッドを抽象メソッドにすることはできません。あなたは正確に何を達成しようとしていますか? –

+1

彼はまだインスタンスを持っていないので。彼は何らかの種類の非直列化を行っています。そのアイデアは次のとおりです。 writing:object.write(stream); reading:オブジェクト= DataObject.read(ストリーム); –

答えて

4

、Javaの静的メソッドがabstractすることはできません、あなたはそれをオーバーライドすることはできません。したがって、サブクラスに特定の静的メソッドを実装させることはできません。

唯一の方法は、(JavaDocに付随するメモのように)静的メソッドを必要とし、リフレクションを使用して実行時(またはビルド時)にサブクラスが必要な静的メソッドを実装することを保証することです。


BTW - これは一般的な「パターン」です。 Serializableは、任意のメソッドを定義していませんが、それはドキュメントだ三つの方法に言及している:

private void writeObject(java.io.ObjectOutputStream out) 
    throws IOException 
private void readObject(java.io.ObjectInputStream in) 
    throws IOException, ClassNotFoundException; 
private void readObjectNoData() 
    throws ObjectStreamException; 

「オブジェクト直列化フレームワークは、」今、はい、それらのメソッドを呼び出した場合、これらのメソッドは、クラスによって実装されている場合、テストするためにリフレクションを使用しています。

しかし、私はこの戦略を使用して、他のソリューション前を探してお勧めします。

1

継承がそのよう静的メソッドには適用されません。あなたはこのように、特定のクラスの静的メソッドを呼び出します。

MonkeyModelObject.fromByteArray(data) 

あなたはクラス「内側」からこれを行う場合でも、あなたは舞台裏まだその特定のクラスにその特定のメソッドを呼び出すです。したがって、静的メソッドを "オーバーライド"する場合、別のクラス(子クラス)に同じ名前の新しいメソッドを作成するだけです。静的メソッドのメソッドの実行時選択はありません。あなたはバイト配列に/から連載をやっているようにあなたが取り組んでいる特定のケースでは

、それはそうです。おそらく、ネットワークストリームなどからメッセージをシリアライズしているのでしょうか?私は多分、この擬似コードは、あなたを刺激することができ、次のようなアプローチをお勧めします:

abstract class Message 
{ 
    void write(stream) 
    { 
     stream.write(getMessageTypeCode()); 
     writeParameters(stream); 
    } 
    abstract int getMessageTypeCode(); 
    abstract void writeParameters(stream); 
    abstract void readParamters(stream); 
} 
class ChatMessage 
{ 
    String text; 
    int getMessageTypeCode() { return 1; } 
    void writeParameters(stream) 
    { 
     stream.write(text); 
    } 
    void readParameters(stream) 
    { 
     text = stream.read(); 
    } 
} 
class MessageDecoder 
{ 
    Message decode(stream) 
    { 
     int type = stream.read(); 
     message = createMessage(type); 
     message.readParameters(stream); 
     return message; 
    } 
    Message createMessage(int type) 
    { 
     if (type == 1) 
     { 
      return new ChatMessage(); 
     } 
     throw new error; 
    } 
} 
2

静的メソッドをオーバーライドすることはできません。あなたはサブクラスで同じ名前とシグネチャを持つメソッドを定義することによってスーパークラスのメソッドをのみを非表示にすることができますが、それは非常に混乱し、したがって、一般的には推奨しません。元のスーパークラスメソッドには、たとえば((SuperClassName) subClassInstance).staticMethod()などでアクセスできます。

あなたのケースでは、それは法非静的にするために、おそらく良いでしょう。

関連する問題