Considera il seguente diagramma UML:
In poche parole:
-
ChildClass1
eChildClass2
utilizzano tutti i membri diParentClass
. -
ChildClass3
utilizza soloMember1
eMember2
e 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
ParentClass
all'interno diChildClass3
e 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.