2013-04-26 2 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 (который должен быть приведен к тип моего дочернего класса) или список SFObjects (которые необходимо индивидуально отнести к типу моего дочернего класса). Есть ли способ (возможно, использование Reflections), чтобы мой дочерний класс возвращал экземпляры себя как самого себя, а не как SFObjects?

+0

Возможно, вы ищете здесь фабрику или абстрактную фабрику. –

ответ

0

Если вы помещаете объект дочернего класса внутри родительского объекта, методы, вызванные, будут выполняться из дочернего класса. Но это будет выглядеть, как родительский объект на поверхности

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

'But 'a' является родительским объектом. Я думаю, вы имели в виду что-то вроде' But 'a' является родительской ссылкой, поскольку 'любой метод, вызываемый в 'a', будет поступать из дочернего класса', потому что' a' * is * объект дочернего класса – Pshemo

0

Не уверен, что если я действительно понимаю вашу проблему правильно, потому что это звучит для меня LKE это:

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

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

Конечно, это не должно быть статичным, просто думать о какой-то фабрике.

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

} 

Это допустимо, так как тип возврата класса детей до сих пор своего рода (иерархическая говоря) родителя.

Помните о условных обозначениях кода Java (методы в случае верблюда, начинающиеся с низкого, например createFromDiffObject).

1

То, что вы описываете, называется covariant return type.

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

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

Это разрешено с Java 1.5.

Смежные вопросы