Diciamo che hai
- auto di classe con Car- > tune () e Car- > drive ()
- classe CarDriver
- classe CarMechanic
Ogni oggetto CarDriver e CarMechanic ha un riferimento / puntatore a un oggetto Car. L'oggetto CarDriver chiamerà $ this- > car- > drive (), l'oggetto CarMechanic chiamerà $ this- > car- > tune ().
La domanda è: come posso impedire a un CarDriver di chiamare $ car- > tune ()?
Ci sono probabilmente due approcci:
- Livello di lingua: utilizzo di modificatori di accesso come pubblico / privato / protetto e quindi abuso dell'ereditarietà o utilizzo di funzionalità di linguaggio più esotiche come una "classe di amicizie" in C ++.
- Composizione: divide l'auto in CarFrontend e CarBackend, oppure crea un DriverCarWrapper, che espone solo il metodo drive ().
Questa sembra una buona idea, ma probabilmente introdurrà clutter e duplicazione del codice, che potrebbero superare i benefici del controllo degli accessi. Soprattutto se ci sono molti metodi che dovrebbero essere accessibili al conducente dell'auto.
Ci sono altre soluzioni che mi sono perse?
Background: il mio caso di utilizzo del mondo reale è in PHP, ma lo sto chiedendo come una domanda su una lingua diversa.