2013-04-26 6 views
3

Java에서 기본/부모 클래스를 작성합니다.이 클래스는 자체적으로 클래스를 만드는 여러 가지 방법을 갖기 때문에 부모 클래스에서 인스턴스를 반환 할 수있는 방법이 있는지 궁금합니다. 자식 클래스의 인스턴스를 반환하는 대신 자식 클래스의 인스턴스를 반환해야합니다. 예를 들어 자식 클래스 개체를 반환하는 부모 클래스를 만듭니다.

, 여기 내 부모 클래스의 :

public abstract class SFObject 
{ 
    // Variables 
    protected String mID; 
    protected String mName; 

    // Function called to create ourselves from a DiffObject 
    public abstract SFObject CreateFromDiffObject(DiffObject object); 

    // Function called to create a list of ourselves from a query 
    public List<SFObject> CreateListFromQuery(Connection connection, String query) 
    { 
    // Run the query and loop through the results 
    ArrayList<SFObject> objects = new ArrayList<SFObject>(); 
    for (DiffObject object : connection.Query(query)) 
     objects.add(CreateFromDiffObject(object)); 

    return objects; 
    } 
} 

내 SFObject 클래스를 기반으로 하위 클래스를 만들 경우, 여전히 캐스트 할 필요가있는 SFObject를 (반환 내 아이 클래스의 두 가지 기능 내 하위 클래스 유형) 또는 SFObject 목록 (하위 클래스 유형으로 개별적으로 캐스팅해야 함) 내 자식 클래스 자체가 SFObjects가 아닌 자체 인스턴스를 반환하도록하는 데는 (어쩌면 Reflections를 사용하는) 방법이 있습니까?

+0

아마 여기서 공장이나 추상 팩터 리를 만들려고합니다. –

답변

0

부모 개체 안에 자식 클래스 개체를 배치하면 호출 된 메서드는 자식 클래스에서 실행됩니다.

class p 
{ 
    public static p createParent() 
    { 
     return new p(); 
    } 

    public static c createChild() 
    { 
     return new c(); 
    } 
} 

물론 그것을하지 않습니다하지만 그것은이 아이크 나에게 소리 때문에 정말 정확한 당신의 문제를 이해한다면

public class A{ 
    method 1(){//do some stuff} 
    method 2(){//do some stuff} 
} 

public class B extends A{ 
    method 1(){super.method 1() 
    //do some other stuff} 
    method 2(){super.method 2() 
    //do some other stuff} 
} 

public class test{ 
    A a = new B(); 

//any method called on 'a' will come from the child class 
// But 'a' is the parent object 

} 
+0

'그러나 'a'는 부모 객체입니다''당신은''a '가 *'* '이므로 *'* 자식 클래스의 객체 – Pshemo

0

확실하지 표면에 부모 개체 모양을 정적 일뿐입니다. 그냥 공장 같은 것 같아요.

0

정확히이 기능은 이미 구현 한대로 factory methods으로 제안되었습니다. 자식 클래스에서 메서드 선언을 위반하지 않고 반환 형식을 변경할 수 있습니다. 당신의 사건에 대한 샘플을 볼 수있는 작품 같은 :

public abstract class SFObject { 
    // Variables 
    protected String mID; 
    protected String mName; 

    // Function called to create ourselves from a DiffObject 
    public abstract SFObject CreateFromDiffObject(DiffObject object); 

    // Function called to create a list of ourselves from a query 
    public List<? extends SFObject> CreateListFromQuery(Connection connection, String query) { 
     // Run the query and loop through the results 
     ArrayList<SFObject> objects = new ArrayList<SFObject>(); 
     for (DiffObject object : connection.Query(query)) 
      objects.add(CreateFromDiffObject(object)); 

     return objects; 
    } 

} 

class SFObjectChild extends SFObject { 

    @Override 
    public SFObjectChild CreateFromDiffObject(DiffObject object) { 
     SFObjectChild result = new SFObjectChild(); 
     //... 
     return result; 
    } 

    @Override 
    public List<? extends SFObjectChild> CreateListFromQuery(Connection connection, 
      String query) { 
     return null;//..; 
    } 

} 

아이 클래스의 반환 형식은 여전히 ​​(계층 말하기) 부모의 일종이기 때문이 허용됩니다.

자바 코드 규칙 (낮은 것으로 시작하는 낙타의 경우 예 : createFromDiffObject)을 알고 있어야합니다.

1

설명하는 내용은 covariant return type입니다.

Class A { 
    A getInstance() { ... } 
} 

Class B extends A { 
    @Override 
    B getInstance() { ... } 
} 

Java 1.5부터 허용되었습니다.

관련 문제