2016-07-15 246 views
1

我在主題上發現了很多帖子,但無法找到我正在尋找的解決方案。如何指定抽象類的方法的返回類型

因此,這裏的交易:

我有兩個子類第一抽象類:

public abstract class A { 
    public A(args){..} 
} 
public class B extends A { 
    public B(args){ 
    super(args); 
    } 
} 
public class C extends A{ 
    public C(args){ 
    super(args); 
    } 
} 

ARGS是一些變數,但在形式上不會改變。 其他一些東西在課堂上,但這裏沒關係。

現在,我有兩個子類是B和C.建設者的大部分是相同的建設者另一個抽象類,所以我想它是在抽象的建設者

public abstract class Builder { 
    public A build(*?*){ 
    //compute args 
    return new *either B or C*(args); 
    } 
} 
public class B_Builder extends Builder { 
    public B build(*?*){ 
    super(*?*); 
    } 
} 
public class C_Builder extends Builder{ 
    public C build(*?*){ 
    super(*?*); 
    } 
} 

再次,建設者的其他東西並不重要。

我的問題是如何告訴Builder abastract類,通過構建器子類應該是什麼樣的構建返回類型。 知道返回類型B和C都擴展A. 我想我應該使用一些通用的東西,但我無法設法使其工作。

任何人都可以幫助我嗎?

非常感謝!

LD

+0

'build()'接受任何參數嗎?構造函數有多少個參數? – shmosel

+0

'build()'至少需要一個參數(持有構建所需數據的類),但它可能採取了其他任何參數。 構造函數需要大約10個參數,這些參數是從'build()'的arg中檢索的數據。 你的解決方案做了伎倆btw,非常感謝!!!! 我也會嘗試其他的,以便更多地瞭解泛型。 – ldebroux

+0

你可以使用工廠模式和觀看*多態*代理 – emotionlessbananas

回答

1

你可以用一個泛型類型參數和做建築,而抽象類做繁重的抽象創作者的方法做到這一點:

public abstract class Builder<T extends A> { 
    public T build(*?*){ 
    //compute args 
    return create(args); 
    } 

    protected abstract T create(args); 
} 

public class B_Builder extends Builder<B> { 
    @Override 
    protected B create(args) { 
    return new B(args); 
    } 
} 

public class C_Builder extends Builder<C>{ 
    @Override 
    protected C create(args) { 
    return new C(args); 
    } 
} 
0

是的,你是足夠接近,一般是要走的路:

答:

public abstract class A <T extends A<?>>{ 

    public abstract T getObject(Object args); 
} 

B:

public class B extends A<B>{ 

     @Override 
     public B getObject(Object args) { 
      // TODO Auto-generated method stub 
      return null; 
     } 

    } 

C:

public class C extends A<C>{ 

    @Override 
    public C getObject(Object args) { 
     // TODO Auto-generated method stub 
     return null; 
    } 


} 
-1

你可以只留下一個像這樣的單個構建方法構建器:

public class BuilderA { 
public static <T extends A> T of(Class<T> type, Object arg) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException { 
    Constructor<T> constructor = type.getConstructor(arg.getClass()); 
    return constructor.newInstance(arg); 
} 
} 

此方法使用反射具有指定類型建立一個實例。它假定同一類型參數的類A,B和C下面是一個電話是什麼樣子的構造函數用於像:

A a1 = BuilderA.of(B.class, 1);   
    A a2 = BuilderA.of(C.class, 2); 
    B b = BuilderA.of(B.class, 2); 
    C c = BuilderA.of(C.class, 2); 

在上面的電話,所有的類都與構造鍵入Integer。如果您有多個參數,則可以使用可變參數作爲最後一個參數,並檢索可變參數的類並使用它們檢索正確的構造函數。

+0

爲什麼downvote? – Slimu

0

將模板參數添加到超類Builder中。

class Builder<T> { 
    T build() {} 
} 

然後,當你擴展使用類似

class ABuilder extends Builder<A> { 
     A build() {} 
    } 

    class BBuilder extends Builder<B> { 
     B build() {} 
    } 

的完整代碼在Codiva online compiler IDE工作的例子。

0

我會建議把相同的部分放在一個方法中,並且B和C的創建代碼應該在子構建器中。

public abstract class Builder<T> { 
    public abstract T create(args); 
    public void build(args){ 
    //do something here 
    return create(args); 
    } 
} 
public class BBuilder extends Builder<B> { 
    @Override 
    public B create(int args) { 
    return new B(args); 
    } 
}