Pensa a un'interfaccia come a un contratto per definire la semantica o un concetto. Questo è un approccio generale e non specifico per la lingua.Nel contesto di OO, se si lavora in un modello di ereditarietà singola, è opportuno creare un caso eccellente per preferire le interfacce rispetto alle classi per definire il proprio modello di oggetto, poiché quel singolo percorso di super classe è piuttosto prezioso e si desidera salvarlo per qualcosa di più "sostanziale" della definizione delle proprietà esposte su un oggetto o metodi.
Per avere la semantica di IContainer (contratto) è un motivo abbastanza scadente per creare un'interfaccia dalla cartella; meglio avere la tua cartella (se sta facendo una logica non banale) "implementa" l'interfaccia IContainer o ICollection (probabilmente già esistente) nei framework core della tua lingua.
Come sempre, la scelta migliore dipende abbastanza dal problema specifico. Nel caso delle tue ricette che sono anche cartelle (?!) Probabilmente stai pensando a una relazione genitore-figlio, o composizione, una semantica che può (e dovrebbe) essere espressa usando le interfacce se avrai altri elementi nel tuo sistema 'operare' su cose che sono composte usando quel tipo di semantica.
C'è un po 'di overhead (programmazione wise) con le interfacce, e, se ti trovi quando hai finito con nient'altro che un set di classi e interfacce Woof e IWoof, allora saprai che probabilmente non l'hai fatto Ho bisogno di esprimere il tuo problema in termini di interfacce - le classi semplici sarebbero state sufficienti.
Come regola generale, per qualsiasi I, è necessario disporre di almeno un paio di classi concrete (con nomi più significativi diversi da IImpl o).
Spero che questo aiuti.
YAGNI, non ne hai bisogno (ne hai bisogno) -> non ne avrai bisogno –
Precisamente. Ogni volta che ho inserito interfacce o qualsiasi cosa "nel caso in cui" si è rivelato necessario assolutamente mai. Ma il tuo chilometraggio può variare. –