Considera il seguente diagramma UML:
In poche parole:
-
ChildClass1eChildClass2utilizzano tutti i membri diParentClass. -
ChildClass3utilizza soloMember1eMember2e il valore diMember5è un valore costante. (0)
Quale sarebbe il modo migliore per implementare questo comportamento?
Al momento, ho ereditato la classe come normale e sovrascritto Member3 e Member4 per lanciare NotSupportedException e reso Member5 sola lettura e restituito 0 per tutto il tempo.
Non sono convinto che questa sia l'idea migliore in quanto Member3 e Member4 sono irrilevanti a ChildClass3 .
Altre cose che ho considerato:
-
Invece di ereditare. Creare un
ParentClassall'interno diChildClass3e quindi esporre solo le proprietà di cui ho bisogno. -
Usare le interfacce, ma è diventato troppo complicato, troppo veloce.
-
Ristrutturazione della gerarchia, ma non l'ho guardato troppo nei dettagli.
Ci sono altre opzioni?
Per contesto: Ho cercato di mantenere questo semplice per evitare muri di codice, ma questo sembra aver portato alla confusione. Spiacenti = /
ParentClass in questo caso è Person, con i seguenti campi:
- Nome: stringa
- Cognome: stringa
- Sesso: stringa
- DateOfBirth: Nullable < DateTime >
- Posizione: int
Ora nella maggior parte dei casi, le classi figlie (Impiegato, Manager, ecc.) usano tutti questi campi. Comunque una classe (Visitatore), ho solo bisogno di sapere un nome, non mi interessa la loro età o posizione. La posizione in questo caso è impostata su 0. So che è un numero magico, ma è importante per il sistema.
Posso capire come questo viola l'LSP, ma allo stesso tempo, non penso davvero che avere interfacce per dividere un nome e altre informazioni personali abbia molto senso. Dare un nome a questo mi darebbe anche un mal di testa.
Nelle altre classi, ci sono interfacce ovunque; IMedicalData, IContactInformation, ecc.
Ho scelto l'ereditarietà solo in questo caso poiché un visitatore è tecnicamente un tipo di persona.