Supponiamo di avere qualcosa di simile:
class Page{
Header header;
Body body;
Footer<TFooterModel> footer; //TFooterModel is a type of content (subcontrol in some sense) that loaded inside footer.
public Page(Header h, Body b, Footer<TFooterModel> f){...} //Let's assume that we setting part in constructor or using Builder pattern.
}
Quindi, Footer
è generico. Tuttavia, sarà logicamente sbagliato, per rendere Page
anche generico e usare Page<TFooterModel>
, solo perché in realtà non utilizzo TFooterModel
da nessuna parte all'interno, tranne che specificando il tipo Footer's
. Anche la conversione di Footer
in catena ereditaria sembra errata, poiché è solo un contenitore per alcuni contenuti e non ha senso nell'ereditarietà, poiché i bambini saranno identici. Questo mi sembra un problema di progettazione, ma non sono sicuro di come risolverlo.
Quindi, qual è il modo corretto di gestire questi scenari, che usano davvero grandi sviluppatori?
Il piè di pagina è solo un contenitore, che carica alcuni contenuti utilizzando loadContent(BaseContent content)
, ma ha un evento. onContentLoaded(OnContentLoadedHandler<ContentImpl> handler)
, quindi una sola differenza tra i bambini sarà un tipo di OnContentLoadedHandler
utilizzato, ecco perché penso che l'ereditarietà sia qualcosa di molto.
C'erano alcune opzioni proposte.
- Crea
Footer
non generico, eredita il piè di pagina generico da non generico e utilizzare non generici all'interno della pagina - Passa a OnContentLoadedHandler in
Footer's
costruttore ed evita generico (comunque la mia opinione personale, potrebbe avere qualche insidia, dovuta alla risoluzione del tipo quando si chiama handler (se è lambda per esempio, o se èdynamic
, ma non ne sono completamente sicuro)) - Aggiungi interfaccia e usalo invece (probabilmente logicamente simile a 1).