Recentemente ho cercato di evitare il down-casting dei tipi di oggetti da un tipo di interfaccia ai loro tipi concreti, e le istruzioni 'if' che controllano il tipo concreto di un oggetto in fase di esecuzione. Questo mi ha fatto pormi una domanda; Perché aggiungere metodi pubblici a classi concrete che implementano anche un'interfaccia?
Ho finito per fare una distinzione tra 2 tipi di classi: un servizio e un elemento di dati, cioè qualcosa che usi rispetto a qualcosa che crei ed estrai (sia allo storage persistente che ad un altro processo). Di solito una classe simile a un server non avrebbe parametri di costruzione a meno che non utilizzi l'iniezione di dipendenza o una factory (tuttavia, si potrebbe sostenere che un servizio che viene costruito all'interno di una factory, prima che inizi ad essere utilizzato come un servizio, corrisponda alla definizione dell'elemento di dati).
Avresti bisogno di usare metodi pubblici se stavi creando un'istanza di una classe per la prima volta e fosse localmente portata al metodo o alla classe. Tuttavia, quando si restituisce l'istanza da un metodo e viene implementata un'interfaccia, in genere viene restituita nella sua forma generica (un'interfaccia). Ciò rende i metodi pubblici non dichiarati come parte dell'interfaccia intoccabili a meno che non lo si scriva sul tipo concreto che, nei principi SE, è una cosa negativa. Spesso, se hai bisogno di fare questo, la classe concreta non dovrebbe usare un'interfaccia per cominciare.
Qual è la convenzione per trattare con metodi pubblici concreti appartenenti a una classe che implementa un'interfaccia? Vengono utilizzati solo quando l'istanza di una classe concreta si trova nello stesso ambito locale?