Ereditarietà dai bambini ai genitori?

5

Vedendo questo diagramma delle classi UML:

FileHandler,UploadereDeletersonoclassiastratte.Lequattroclassiinferiorisonoimplementazioni.SiestendonosuFileHandlerInterfacecherichiedeunmetodohandleperconvalidareilcontratto.Maquestometodononènelleimplementazioni,èneilorogenitori(Uploader&Deleter).

L'hofattoperchénonmipiaceval'ideadiimplementareun'interfacciainunaclasseastratta.

Anchese,misembrachecisiaunenormedifettoinquestoprogetto.Ilfattochesianecessariopassareattraversoigenitoripersaperecomefunzionailbambinomifasembrareuncattivodesign.

Peresserepiùprecisi,nonèchiarocheilgenitoredirettodiUploaderCompleteabbiaunmetodo"handle", anche se ha pensato che ne abbia bisogno. Potrebbe essere nel genitore di Uploader (e in modo ricorsivo).

Dove si trova questo disegno sbagliato e come potrei migliorarlo?

Grazie.

    
posta Steve Chamaillard 30.05.2016 - 14:21
fonte

1 risposta

6

FileHandler dovrebbe implementare FileHandlerInterface . I metodi astratti comuni a tutti i bambini come handle() devono essere sollevati a FileHandlerInterface se pubblici, FileHandler se non.

Lo scopo delle classi e delle interfacce astratte è definire il contratto per le classi concrete e consentire il polimorfismo. Se mi viene consegnato FileHandlerInterface , dovrei essere in grado di fare tutto ciò di cui ho bisogno indipendentemente dall'attuale implementazione.

In base al diagramma nella domanda, sembra che il polimorfismo funzionerà come previsto se passi dei riferimenti di FileHandlerInterface .

Tuttavia, la tua gerarchia è fragile . Se apporti una modifica in una parte della gerarchia, potrebbe causare incongruenze con altre parti della gerarchia. Inoltre, è possibile definire un'altra sottoclasse di FileHandler , ma potresti dimenticare di aggiungere FileHandlerInterface . Il fatto che sia possibile creare un nuovo gestore di file che non sia effettivamente un gestore di file mi dice che la gerarchia non è corretta e FileHandler deve implementare FileHandlerInterface .

    
risposta data 31.05.2016 - 06:06
fonte