Quando si sviluppa in OOP, a volte un'interfaccia / contratto è data da una libreria che non è possibile modificare. Chiamiamo questa interfaccia J.
Ora hai un oggetto di classe A che consuma oggetti che implementa questa interfaccia. Dentro A è necessaria solo una piccola parte delle definizioni dell'interfaccia. Alcune delle classi oggetto sono create da me durante il progetto (chiamiamone uno di loro tipo D), quindi c'è un sovraccarico nell'implementazione di tutto all'interno dell'interfaccia J.
Voglio implementare un sottoinsieme della funzionalità nell'interfaccia J, ma le mie soluzioni finora non mi soddisfano:
- implementare ogni aspetto di J e lanciare "notImplementedExceptions" disinforma l'utente dei miei oggetti: sembrerebbe che i miei oggetti di tipo D siano conformi all'interfaccia J, ma non lo fanno - e altri consumatori dei miei oggetti (che accettano oggetti che implementano l'interfaccia J) non possono fare affidamento sull'integrità dei miei oggetti.
- L'implementazione di un'interfaccia appena definita mi impedisce di utilizzare oggetti che implementano solo l'interfaccia J, sebbene l'interfaccia J sia completamente compatibile con la mia interfaccia.
- Lasciare che i miei oggetti personalizzati implementino l'interfaccia J creerebbe un sovraccarico significativo, perché non hanno bisogno di tutte queste funzionalità.
Quando sono stato in grado di modificare l'interfaccia J, vorrei creare una "superinterfaccia" K che avesse questo sottoinsieme della funzionalità dell'interfaccia J, e rendere l'interfaccia J ereditata dall'interfaccia K. Ma non posso modificare l'interfaccia J.
Che cos'è una soluzione orientata agli oggetti a questo problema? La soluzione migliore è ancora implementando l'interfaccia "giusta" J? O ci sono OOP-modi per "superclassare" un'interfaccia senza alterarla?