Quando dovrebbero essere usati metodi pubblici concreti se si implementa un'interfaccia?

2

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?

    
posta Mayron 13.02.2018 - 13:27
fonte

1 risposta

3

Questo è troppo ampio. Esistono molte lingue in cui la maggior parte delle classi implementa varie interfacce, ad es. Printable o Iterable , senza che questa sia la loro caratteristica di definizione.

È una buona idea evitare type-checking e downcasting oggetti per ottenere i loro metodi pubblici. Ciò dimostra che è stato un errore dichiarare un tipo di interfaccia in primo luogo.

Ma un oggetto non è sempre usato sotto l'aspetto del suo tipo di interfaccia. Ci possono essere molti altri usi legittimi in cui gli oggetti sono dichiarati come il loro vero tipo, e non ha senso proibire a classi diverse di avere metodi diversi semplicemente perché possono entrambi servire lo stesso master.

    
risposta data 13.02.2018 - 13:55
fonte

Leggi altre domande sui tag