簡體   English   中英

指定超類構造函數中的哪個子類

[英]Specifying which subclass in super class constructor

我試圖首先填充通用對象列表,然后實例化它們,並在實例化它們時,指定每個對象中的哪一個。

我正在研究的用例是讀取數據文件並構建一個具有各種可交互對象的地圖。 每個對象可交互的類型存儲在它自己的數據文件中,該文件來自地圖的數據文件。 一些代碼例如:

在閱讀地圖時:

    if ((char)map[i][j] == '*')
           mapObjects.add(new MapObject());

然后:

    for (int i = 0 ; i < mapObjects.size() ; i++)
            mapObjects.set (i, new MapObject(in.readLine())); 
            //in.readLine gives the path for the file

在MapObject的構造函數中:

    public MapObject (String in){
    try{
        BufferedReader br = new BufferedReader(new FileReader("src/data/" + in + ".txt"));
        int temp = Integer.parseInt(br.readLine());
        if (temp == 0)
            this = new Door (); //this is apparently not allowed

            /*continue to instantiate the Door's fields from the data file*/
    }

和門類:

    public class Door extends MapObject {
        public Door () {}
    }

我意識到這可能不是解決這個問題的最佳方法,但它提出了這不起作用的好奇心。 有沒有辦法做到這一點? 讓super的構造函數選擇它將成為哪個子類?

不可能。 因為必須首先調用子類構造函數,並且它(顯式或隱式)調用超類構造函數。 所以Door(例如)構造函數必須已經在超類教師之前被調用,如果這是一個Door的實例。

這里的父母/子女不是正確的條款。 您似乎在談論一個類和一個或多個子類。

回應編輯過的問題:

您可能希望用MapObject工廠替換MapObject構造函數。 搜索工廠模式或靜態工廠方法模式。

你想要的是抽象工廠模式

簡單地說...

讓超類知道子類的設計很糟糕,但是有一個知道兩者的單獨類是可以的。

抽象工廠定義了一個返回抽象類型(接口或超類 - 在本例中為MapObject)的工廠方法 ,該方法根據方法的參數決定返回哪個確切的類。

一個簡單的例子是:

public class MapObjectFactory {

    public MapObject create(int i) {
        if (i == 0)
            return new Door();
        if (i == 1)
            return new OtherSubClass();
        // etc, then a "default" in case above conditions not met
        return new MapObject();
    }
}

然后調用:

MapObjectFactory factory = new MapObjectFactory();

MapObject m = factory.create(Integer.parseInt(br.readLine()));

您可以將create()方法設置為static以避免必須創建MapObjectFactory實例來調用無狀態方法:

MapObject m = MapObjectFactory.create(Integer.parseInt(br.readLine()));

但是如果你想讓選擇標准變得動態,你就不能在運行時交換另一個實現。 在這種情況下,您可以使工廠類實現一個接口,並使用類名來加載它(或者甚至為抽象工廠設置一個抽象工廠!)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM