Java 创建返回子类对象的父类
我正在用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
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() { ... }
}