我有一個簡單的遊戲代碼,其中AgentInterface必須實現以便爲遊戲中的其中一個角色創建代理控制器。 GameState是實現GameStateInterface的類,並且實現此接口的對象可以傳遞給代理,因此代理可以從遊戲狀態讀取和分析數據,並且代理必須返回適當的操作(作爲int返回)角色應該採取。是否可以阻止/拒絕Java中的強制轉換?
這是AgentInterface代理商必須實現:
public interface AgentInterface {
// the return value specifies the direction of the joystick
public int action(GameStateInterface gs);
}
運行遊戲的代理稱爲MyAgent:
GameState gs = new GameState();
AgentInterface agent = new MyAgent();
while (true) {
// more code here
int bestAction = agent.action(gs)
// more code here
}
但是,有在遊戲狀態的一些信息,代理不應該能夠訪問,因爲這將是對控制器的欺騙。但是,這樣做從GameStateInterface鑄造轉化爲遊戲狀態將允許代理訪問未在GameStateInterface定義的信息,像這樣:
public MyAgent implements AgentInterface {
public int action(GameStateInterface gs) {
int nLives = ((GameState) gs).nLivesRemaining; // IS IT POSSIBLE TO DENY/PREVENT THIS CAST??
// Do more stuff here
return BestAction;
}
}
我的問題是,是否有可能阻止鑄造轉換?我知道多態是Java和麪向對象編程語言的主要特性之一,但在這種情況下,我想避免強制轉換。
我知道這可以通過許多其他方式解決,但我很想知道是否有可能這樣做。
在此先感謝。
這似乎是一個很好的解決方案。 +1 – 2009-12-07 22:59:00
警告 - 確保配置了Java安全性,以便代理(即不可信)代碼不能使用Reflection API。有人可以使用反射來訪問代理類的私有成員來獲取GameState對象。 – 2009-12-08 03:14:10