Java 创建返回子类对象的父类

Java 创建返回子类对象的父类,java,inheritance,casting,parent-child,Java,Inheritance,Casting,Parent Child,我正在用Java构建一个基类/父类,它将有几个方法来创建类本身,我想知道是否有办法让父类返回子类的实例,而不是返回父类的实例,然后必须将这些实例强制转换到子类 例如,下面是我的父类: public abstract class SFObject { // Variables protected String mID; protected String mName; // Function called to create ourselves from a DiffObject

我正在用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
{
//变数
保护串中;
受保护的字符串mName;
//调用函数从DiffObject创建我们自己
公共抽象SFObject CreateFromDiffObject(DiffObject对象);
//调用函数从查询创建我们自己的列表
公共列表CreateListFromQuery(连接、字符串查询)
{
//运行查询并循环查询结果
ArrayList对象=新的ArrayList();
for(DiffObject对象:connection.Query(查询))
添加(CreateFromDiffObject(object));
归还物品;
}
}

如果基于SFObject类创建子类,则子类中的两个函数仍将返回SFObject(需要转换为我的子类类型)或SFObject列表(需要单独转换为我的子类类型)。是否有任何方法(可能使用反射)使我的子类将自身的实例作为自身而不是作为SFObject返回?

如果将子类对象放置在父对象内部,则调用的方法将从子类运行。但它看起来像曲面上的父对象

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

}

我不确定我是否真的理解了你的问题,因为我觉得:

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

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

当然,它不必是静态的,只要想想某种工厂就可以了。

正是针对这种功能,我们提出了一些建议,正如您已经实现的那样。在子类中,可以在不违反方法声明的情况下更改返回类型。您案例的样本如下所示:

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

}
公共抽象类SFObject{
//变数
保护串中;
受保护的字符串mName;
//调用函数从DiffObject创建我们自己
公共抽象SFObject CreateFromDiffObject(DiffObject对象);
//调用函数从查询创建我们自己的列表

公共列表您所描述的内容称为公共列表


这在Java 1.5中就被允许了。

也许你想在这里创建一个工厂或抽象工厂。
但是'a'是父对象
我想你的意思类似于
,但是'a'是父引用
,因为
在'a'上调用的任何方法都将来自子类
,因为
a
是儿童班
Class A {
    A getInstance() { ... }
}

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