Puntatore all'oggetto con accesso privilegiato?

2

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:

  1. 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 ++.
  2. 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.

    
posta donquixote 09.07.2014 - 05:02
fonte

1 risposta

1

Quello che vuoi fare è Double Dispatch .

Fondamentalmente, vuoi inviare la chiamata alla classe Car in base al fatto che l'oggetto che interagisce con la Car sia un CarDriver o CarMechanic.

Un modo popolare per implementarlo in linguaggi orientati agli oggetti è con il Pattern visitatori .

Nel tuo caso, crei le classi DriverVisitor e MechanicVisitor che chiamano rispettivamente le classi Driver e Mechanic. Questi visitatori a turno invocheranno i metodi appropriati sulla classe Car consentiti per i ruoli Driver e Meccanico.

    
risposta data 09.07.2014 - 05:32
fonte

Leggi altre domande sui tag