如何在ClassX工厂中声明方法,以便其子工厂可以使用子类ClassX-1常量?

时间:2015-06-07 17:56:23

标签: java generics design-patterns

我有一个MapFactory,它是一个抽象类,用于实现子工厂类Map1Creator,Map2Creator,Map3Creator,...,MapNCreator之间的共享方法 这些nCreators返回一个Map1(它扩展了Map类),它已经用MapN类中的常量进行了初始化。 我的教授要求使用工厂模式而不是构造函数,所以我不得不在我的MapN类中删除它们。

Map类:

public abstract class Map {

    protected Sector[][] grid;
    protected List<Integer> dangerousSectCoord ;
    protected List<Integer> normalSectCoord;
    //[...]
    protected List<Integer> emptySectCoord;
    //all the getters...
}

在子类Map1中(字符串因为它们将从文件中读取):

public class Map1 extends Map{
    private final static int ROWS_NUMBER=14;
    private final static int COLS_NUMBER=23;
    private final static String normSectorString= "all the sectors...";
    private final static String dangerousSectorString [......]
    private final static String escapeSectorString="B10,F01,P01,V11";

}

在MapFactory中,我不能只使用一种MapN来指定方法,所以我只能编写非特定的方法:

public abstract class MapFactory {
    public abstract Map createMap();
    //here there should be 
    //assignSectors(Map m);
    //setDimensions(Map m);
    //but MapN can't be converted to Map and in the MapNCreator Eclipse
    //reminds me that I must implement the father's methods

    public List<Integer> mapStrings(String string){
        List<Integer> coor=new ArrayList<Integer>();
        //parse sub-classes strings and convert them to coordinates;
    }
}

所以在MapNCreator中:

public class Map1Creator extends MapFactory{
    public Map1 createMap(){
        Map1 m= new MapGalvani();
        setDimensions(m)
         assignSectors(m);
        return null;
     }

    public void setDimensions(Map1 m ) {
        m.grid= new Sector[m.getRowsNumber()][m.getColsNumber()];
        m.alienSectCoord=new ArrayList<Integer>();
        //[...]
        m.emptySectCoord=new ArrayList<Integer>();
    }

    public void assignSectors(Map1 m){
        //parse those constant strings and put them in the grid
        //m.constantStringNormalSectors 
    }

但是你可以看到&#34; m&#34; map特别是Map1,方法需要Map1类中的常量。如果我在MapFactory中声明这些方法,它会在MapNCreators中给我一个错误,因为它们无法从Map转换为MapN(我认为多态会覆盖这个......)。 有没有办法在&#34;父亲&#34;中声明方法?工厂类,以便任何子创建者类都能够使用他们自己的类型?

1 个答案:

答案 0 :(得分:0)

答案,一年后:在父类中创建一个通用的返回/参数类型:

<T extends Map> or <? extends Map>