2010-12-14 7 views
1

나는 DB에서 쓰고 읽는 방법을 가진 부모 클래스가 있습니다. 문제는 내가 일반화하고 싶은 정적 방법입니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 몇 가지 해결책을 생각해 냈지만 모두 정적 방법으로는 작동하지 않습니다.정적 메서드 heritation

자식 개체가 추상 메서드를 구현하도록 할 수있는 방법이 있습니까?

부모 클래스 :

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

그는 아직 인스턴스가 없기 때문에. 그는 일종의 비 직렬화를하고 있는데, 아이디어는 다음과 같습니다. 쓰기 : object.write (stream); 읽기 : object = DataObject.read (stream); –

답변

4

자바에서 정적 방법은 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()).

아마도이 방법을 비 정적으로 만드는 것이 좋습니다.