Ik ben bezig met een applicatie voor de Microsoft HoloLens met C# en Unity maar loop tegen een OO programming probleempje aan.
Ik heb een script dat verantwoordelijk is voor het selecteren en verplaatsen van hologrammen. Dit script komt uit de standaard HololensToolkit en heet TapToPlace.cs. Daarnaast heb ik een script dat de positie van hologrammen via het netwerk deelt, deze heb ik zelf geschreven en heet NetworkObject.cs.
Het NetworkObject script moet bij een aantal publieke variabelen uit TapToPlace.cs kunnen. Maar TapToPlace.cs die een listener heeft voor bepaalde handgebaren heeft moet ook een methode uit NetworkObject kunnen aanroepen.
Voor een nette werking van het programma is het belangrijk dat deze scripts gescheiden blijven. Want TapToPlace moet ook op lokale objecten (die niet via het netwerk gedeeld worden) werken . Het is waarschijnlijk geen nette oplossing om een bidirectional association te maken tussen TapToPlace en NetworkObject.
Zelf zit ik eraan te denken om NetworkObject te laten ervan van TapToPlace. Netwerk objecten hebben namelijk ook altijd een TapToPlace script nodig en kunnen op deze manier gemakkelijk bij de variabelen uit TapToPlace. Het enige dat nu nog moet gebeuren en waar ik niet helemaal uitkom. Hoe kan de base class TapToPlace een methode uit de derived class NetworkObject aanroepen wanneer TapToPlace een bepaald handgebaar ziet?
Hieronder een sterk vereenvoudigde weergave van beide scripts:
Ik heb een script dat verantwoordelijk is voor het selecteren en verplaatsen van hologrammen. Dit script komt uit de standaard HololensToolkit en heet TapToPlace.cs. Daarnaast heb ik een script dat de positie van hologrammen via het netwerk deelt, deze heb ik zelf geschreven en heet NetworkObject.cs.
Het NetworkObject script moet bij een aantal publieke variabelen uit TapToPlace.cs kunnen. Maar TapToPlace.cs die een listener heeft voor bepaalde handgebaren heeft moet ook een methode uit NetworkObject kunnen aanroepen.
Voor een nette werking van het programma is het belangrijk dat deze scripts gescheiden blijven. Want TapToPlace moet ook op lokale objecten (die niet via het netwerk gedeeld worden) werken . Het is waarschijnlijk geen nette oplossing om een bidirectional association te maken tussen TapToPlace en NetworkObject.
Zelf zit ik eraan te denken om NetworkObject te laten ervan van TapToPlace. Netwerk objecten hebben namelijk ook altijd een TapToPlace script nodig en kunnen op deze manier gemakkelijk bij de variabelen uit TapToPlace. Het enige dat nu nog moet gebeuren en waar ik niet helemaal uitkom. Hoe kan de base class TapToPlace een methode uit de derived class NetworkObject aanroepen wanneer TapToPlace een bepaald handgebaar ziet?
Hieronder een sterk vereenvoudigde weergave van beide scripts:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| public class TapToPlace : MonoBehaviour, IInputClickHandler { public bool IsBeingPlaced; public virtual void OnInputClicked(InputClickedEventData eventData) { IsBeingPlaced = !IsBeingPlaced; // Roep objectIsBeingPlaced() uit NetworkObject aan } } public class NetworkObject : TapToPlace { public void objectIsBeingPlaced() { // Do Something } } |