Ho un problema con l'implementazione dell'interazione generica dell'interfaccia utente.
Ho classi diverse che contengono dati ciascuno per particolari elementi dell'interfaccia. Quindi ogni UserInterfaceElementComponent
ha dati utili solo per lui - tutti i dati ereditano da UserInterfaceElementComponentData
. Per esempio,
UserInterfaceElementRightCorner
può utilizzare solo dati di tipo UserInterfaceElementComponentDataRightCorner
.
Il problema è nella parte generica - Ho classe UserInterfaceManager
che ha un metodo generico:
public static void TransferDataToUIController<T>(T userInterfaceElementComponentData) where T: UserInterfaceElementComponentData
{
_userInterfaceController.TransferUIDataToComponent(userInterfaceElementComponentData);
}
Quindi da qualsiasi classe posso inviarlo tutti i dati che ereditano da UserInterfaceElementComponentData
. E chiede al controllore di trasferire questi dati a un particolare UserInterfaceElementComponent
ottenendo il suo tipo enum:
public void TransferUIDataToComponent<T>(T userInterfaceElementComponentData) where T: UserInterfaceElementComponentData
{
this._userInterfaceElements[(int)userInterfaceElementComponentData.ElementComponentType].AcceptUserInterfaceElementComponentData(userInterfaceElementComponentData);
}
Quindi ottiene un particolare componente dell'interfaccia utente da questo array this._userInterfaceElements
che corrisponde a questo tipo di dati. Quindi chiama per accettare i dati che gli sono stati dati.
public class UserInterfaceElementRightCorner : UserInterfaceElementComponent {
public override void AcceptUserInterfaceElementComponentData(UserInterfaceElementComponentData userInterfaceElementComponentData)
{
((UserInterfaceElementComponentDataRightCorner)userInterfaceElementComponentData)._planetInfoPanel.gameObject.SetActive(true);
}
}
Sebbene sia necessario lanciare questo oggetto sul tipo corrispondente per ottenere questi dati particolari, quindi potrei usarlo in quella classe nel modo che mi serve, ma vorrei evitare il cast dell'oggetto perché verrà chiamato più di 10000 volte al secondo .
Non mi interessa cambiare l'intera architettura, ho solo bisogno di passare l'oggetto come parametro e dovrebbe già essere il tipo di cui ho bisogno. Anche se con i farmaci generici sembra impossibile.
Altrimenti, dovrò creare un nuovo metodo per ogni tipo in 2 classi e confrontare i tipi. In generale, ho bisogno di passare particolari tipi di dati a particolari client senza casting e con metodi 1-2.