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 クラスに基づいて子クラスを作成すると、子クラスの 2 つの関数は SFObject (子クラスの型にキャストする必要がある) または SFObject のリスト (子クラスの型に個別にキャストする必要がある) を返します。子クラス タイプ)。子クラスがそれ自体のインスタンスを SFObject としてではなく、それ自体として返すようにする方法 (おそらくリフレクションを使用) はありますか?

4

4 に答える 4

1

あなたが説明しているものは、共変の戻り値の型として知られています。

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

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

これは Java 1.5 以降で許可されています。

于 2013-04-26T22:11:01.963 に答える
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

}
于 2013-04-26T20:55:36.457 に答える
0

あなたの問題を本当に正しく理解しているかどうかはわかりません。私には次のように聞こえるからです。

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

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

もちろん、静的である必要はありません。ある種のファクトリを考えてみてください。

于 2013-04-26T20:56:05.410 に答える
0

まさにこの機能のために、すでに実装されているように、ファクトリ メソッドが提案されています。子クラスでは、メソッド宣言に違反することなく戻り値の型を変更できます。あなたのケースのサンプルは次のようになります。

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 コードの規則 (キャメル ケースのメソッドは low で始まります。例: createFromDiffObject) に注意してください。

于 2013-04-26T21:05:38.390 に答える