2016-09-19 61 views
3

在我目前的項目,我有一對夫婦的繼承自一個抽象類變量類。其中一個相似之處在於,它們都需要根據抽象類的擴展來調用新的特定控制器類。這些類也有許多相似之處,其中之一是它們保存哪個對象構造它們。我可以改變類的變量在抽象類

現在我試圖讓一個抽象類,這些控制器類,和我做,將創建它們的抽象類的變量。當現在的問題在於是,我需要我的這個控制器類的實現抽象類的創建者更改爲控制器類

這聽起來真的令人困惑的實施。我將寫下一個例子:

public abstract class ObjectController { 
protected GameObject gameObject; 
protected Game gameVersion; 

public ObjectController(GameObject object, Game gameVersion){ 
    this.gameObject = object; 
    this.gameVersion = gameVersion; 
} 
public abstract void nextAction(); 
} 

所以這是我的抽象Controller類,我會寫下來擴展該控制器類的一個實例。這個類需要保存一個擴展抽象GameObject類的對象。雖然,我很確定,在構造這個類之後,'gameObject'變量充滿了GameObject的特定擴展,但我想用這個變量做一些事情,只有這個擴展可以做到。

public class PlayerController extends ObjectController { 
    int speed = 0; 
    public PlayerController(Player player, Game gameVersion{ 
     super(player, gameVersion) 
    } 
    public void updateSpeed(){ 
     speed = player.getSpeed() // example of a method only the Player class has 
    } 
} 

我該如何做到這一點,而不需要不斷地將player變量轉換爲Player類呢?

回答

3

如果你正在運行到這個問題,所有的控制器,我建議使用一個通用:

abstract class ObjectController<T extends GameObject> { 
    protected T gameObject; 
    protected Game gameVersion; 

    public ObjectController(T object, Game gameVersion){ 
     this.gameObject = object; 
     this.gameVersion = gameVersion; 
    } 
    public abstract void nextAction(); 
} 

class PlayerController extends ObjectController<Player> { 

    public PlayerController(Player object, Game gameVersion) { 
     super(object, gameVersion); 
    } 

    @Override 
    public void nextAction() { 
     //Work with your Player here 
    } 

} 

當你作出這樣的extends ObjectController,你迫使超類的T gameObject以符合控制器某些類型是instanceof GameObject。這樣,在泛型超類中任何提及的T都會成爲您想要使用的類型。

編輯:如果你想引用一個GameObjectObjectController

public class GameObject { 
    private ObjectController<? extends GameObject> controller; 

    //Getter/setter for controller 
} 

你甚至可以實例化controllerGameObject的構造,如果你喜歡。

通配符?或多或少告訴編譯器該通用將在運行時「屬於某些類instanceof GameObject」。通配符可有點硬,如果你的編碼時,有意識地類類型的工作,但因爲你知道每個控制器的通用類型是GameObject的課,你應該能夠簡單地通過object.getController()訪問它。

+0

謝謝你的工作!後續問題雖然:如果我在抽象的GameObject類中存儲該控制器類(我試圖將GameObject類保存在Controller類中,反之亦然)如何更改GameObject擴展中的泛型?我現在將它作爲原始類型保存在我的抽象類中,並嘗試在擴展中定義泛型,但這給了我一個錯誤。 – Typhaon

+0

你想保留對GameObject控制器的引用,但是在'GameObject'級別? – Zircon

+0

是啊,有點..我認爲這是最簡單的方法,但我願意提供建議。此刻,所有gameObjects都存儲在一個Set中,並且我遍歷每一幀,請求getController()。nextAction(); – Typhaon

1

嘗試仿製藥:

public abstract class ObjectController<T extends GameObject> { 

    protected T gameObject; 

    // ... 

    public ObjectController(T object, Game gameVersion) { 
     // ... 
    } 
} 

public class PlayerController extends ObjectController<Player> { 

    // ... 
} 

其中T extends GameObject意味着你ObjectController「知道」一些關於延長GameObject和代表的具體類型,使用它的子類,其決定一個類型。