vorrei creare un'estensione della vostra interfaccia per solo le classi che hanno bisogno di metodi aggiuntivi ...
public interface BaseInterface {
public int exampleMethod();
}
public interface ExtendedInterface extends BaseInterface {
public int anotherMethod();
}
Le migliaia di classi già implementano BaseInterface
. Per le classi che richiedono il metodo aggiuntivo, le modifichi per implementare ExtendedInterface
.
Se gli oggetti vengono memorizzati in una collezione così come un array BaseInterface[]
, questo funziona ancora perché gli oggetti di tipo ExtendedInterface
sono anche oggetti di tipo BaseInterface
, in modo che possano ancora essere immagazzinate nella stessa collezione comune.
Ad esempio, questo è ancora perfettamente valido ...
BaseInterface[] objects = new BaseInterface[2];
objects[0] = new ClassThatImplementsBaseInterface();
objects[1] = new ClassThatImplementsExtendedInterface();
Tuttavia, se avete bisogno di accedere al nuovo metodo della ExtendedInterface
, ma l'oggetto viene memorizzato in una raccolta BaseInterface
, è necessario di gettare in un ExtendedInterface
prima di poter utilizzare ...
BaseInterface[] objects = new BaseInterface[1];
objects[0] = new ClassThatImplementsExtendedInterface();
if (objects[0] instanceof ExtendedInterface){
// it is an ExtendedInterface, so we can call the method after we cast it
((ExtendedInterface)objects[0]).anotherMethod();
}
else {
// it is a BaseInterface, and not an ExtendedInterface
}
Questo può o può non essere adatto, a seconda dell'uso.
Se davvero avete bisogno di tutte le migliaia di oggetti per implementare il nuovo metodo, dovrete aggiungere il metodo allo BaseInterface
e quindi utilizzare una funzionalità del vostro IDE o editor di testo per implementare il metodo in tutte le vostre classi. Ad esempio, è possibile aprirli tutti in un editor di testo e fare una ricerca-sostituzione su trovare qualcosa che è comune a ogni classe e sostituire con il codice comune + il codice predefinito per il nuovo metodo. Abbastanza veloce e indolore. Sono sicuro che alcuni IDE probabilmente aggiungerebbero automaticamente la dichiarazione del metodo a tutte le classi ereditarie, o almeno avranno un'opzione per farlo in un menu di scelta rapida.
Modificare l'interfaccia in una classe astratta e fornire un'implementazione di base? –
Hai migliaia di classi? Wow. –
@verisimilitude Questa soluzione non creerebbe presto un incubo di manutenzione e introdurrà molte interfacce nel sistema? – Thihara