基類屬性重寫爲派生類型和訪問想象以下類:通過基類
public abstract class State {}
public abstract class View : MonoBehaviour {
public State state;
}
現在我想從兩個類派生創建StateA
和ItemA
。
public class StateA { // some properties }
public class ViewA : View {
public StateA state;
}
ViewA
應該只接受StateA
作爲其狀態。設置一個假想的StateB
應該是不可能的。當我試圖設置的ViewA
View view = someGameObject.GetComponent<View>;
view.state = new StateA();
只有基類的狀態的狀態將被設置。在我的情況下投射到ViewA
並不是真的可能,因爲它必須動態投射。
現在我想出了兩種可能的解決方案。
解決方案1 - 類型檢查和投
所有狀態類保持不變。基類正在檢查狀態的正確類型。
public abstract class View : MonoBehaviour {
public State state;
public Type stateType;
public void SetState (State state) {
if (state.GetType() == this.stateType) {
this.state = state;
}
}
}
要訪問ViewA
狀態我這樣做:
(StateA)this.state
解決方案2 - 團結路
State
將改爲從MonoBehaviour派生。
public abstract class State : MonoBehaviour {}
要將狀態添加到項目中,我只想一個新StateA
組件添加到遊戲對象。該項然後用GetComponent加載該狀態來訪問它。
viewA.gameObject.AddComponent<StateA>(); // set state with fixed type
viewA.gameObject.AddComponent (type); // set state dynamically
this.gameObject.GetComponent<StateA>(); // get state in item class
結論
這兩種解決方案都沒有在我看來,理想的。你們知道有更好的方法來做這種事嗎?我希望你明白我想要達到的目標。期待看到你的想法。
編輯
似乎過於簡單化我我的問題。爲了弄清楚爲什麼我這樣做,在UI中將Item
視爲View
。 StateA
沒有任何功能。相反,它只是讓視圖知道它應該做什麼的一些屬性。例如,對於表格視圖,狀態將包含要顯示的事物的集合。
public class StateA : State {
SomeObject[] tableViewData; // which data to load into the table view
}
或換另一種觀點。
public class StateB : State {
bool hideButtonXY; //should I hide that button?
}
在另一大類我把最後的歷史表現出與他們各自的國家的意見。這樣我就可以通過普通的網頁瀏覽器實現來回功能。 我希望這可以讓我的意圖清晰。
當你在'Item'中使用它時,你有什麼理由需要知道'State'實例的具體子類? – Serlite
(就像...在什麼情況下阻止你從ItemA中存儲'State'類型的變量,而不是'StateA'?) – Serlite
將特定的實現結合在一起通常不是一個好主意,你能否包括爲什麼您需要在示例中這樣做? – CaTs