2013-04-26 138 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列表(需要单独转换为我的子类类型)。有什么办法(可能使用反射)让我的子类返回自身的实例,而不是SFObjects?

+0

也许你正在寻找创建一个工厂或抽象工厂,而不是在这里。 – 2013-04-26 20:50:21

回答

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

'但是'a'是父对象'我认为你的意思是''但'a'是父引用',因为''a'上的任何方法都会来自子类',因为'a' *是*儿童班的对象 – Pshemo 2013-04-26 20:58:47

0

不知道如果我真的能理解你的问题正确的,因为它的声音,我艾克这样的:

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以来,这已被允许。