Come decidere tra composizione e generalizzazione quando si progettano oggetti e le loro relazioni?

StackOverflow https://stackoverflow.com/questions/602063

  •  03-07-2019
  •  | 
  •  

Domanda

Ho pensato di cercare questa risposta dalla comunità di stackoverflow su come decidere di optare per la composizione o la generalizzazione quando progettiamo le lezioni.

È stato utile?

Soluzione

Usi la composizione quando hai una classe che ha un insieme di altri oggetti, in qualsiasi quantità. Usa la generalizzazione quando hai una classe che condivide proprietà comuni con un insieme di oggetti, ma può anche avere altre proprietà o comportamenti diversi.

Ad esempio, un'auto ha componenti come il motore, le ruote, ecc. Questa è una relazione di composizione. Ma un veicolo è una generalizzazione di un'auto, perché puoi avere altri tipi di veicoli con proprietà diverse, come un camion. Auto e camion sono classi derivate di veicoli.

Altri suggerimenti

Chiediti se la relazione tra le due classi è di " is-a " o un " has-a " Tipo

Se stiamo parlando dell'eredità pubblica (IS_A), la chiave è capire il principio di sostituzione di Liskov e cosa significa rispetto all'eredità. In particolare, significa che la relazione IS-A dipende dal contesto che è un aspetto spesso trascurato dell'eredità pubblica.

Per usare l'esempio sopra, le classi Car e Truck dovrebbero essere derivate dal Veicolo solo se possono essere sostituite alla classe Veicolo in qualsiasi programma scritto per usare la Classe Veicolo senza influire sul codice chiamante.

Se stiamo parlando dell'ereditarietà dell'implementazione (aka, eredità privata in C ++), dovresti preferire la composizione rispetto all'eredità come meccanismo di riutilizzo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top