Quando qualcuno scrive codice come questo, lui/lei sta cercando di seguire un principio di progettazione OO di base che dice -
programma a un'interfaccia, non ad una concreta attuazione
devo ha spiegato questo principio in one of my blog posts. Guarda nella sezione Class Inheritance VS Interface Inheritance
.
Per riepilogare il post, quando si utilizza un riferimento di un tipo genitore per fare riferimento a un'istanza di un sottotipo, si ottiene molta flessibilità. Ad esempio, se in futuro avessi bisogno di cambiare l'implementazione del sottotipo, sarai in grado di farlo facilmente, senza modificare gran parte del tuo codice.
Si consideri il seguente metodo -
public void DoSomeStuff(Super s) {
s.someMethod();
}
e una chiamata a questo metodo -
DoSomeStuff(new Sub());
ora, se mai hai bisogno di cambiare la logica interna someMethod
, si può facilmente farlo dichiarando un nuovo sottotipo di Super
, ad esempio NewSubType
e modifica della logica all'interno di tale implementazione. In questo modo, non dovrai mai toccare altri codici esistenti che utilizzano quel metodo.Sarà ancora in grado di utilizzare il metodo di DoSomeStuff
nel seguente modo -
DoSomeStuff(new NewSubType());
Avevi dichiarato il parametro di DoSomeStuff
essere di Sub
, si sarebbe poi dovuto cambiare la sua attuazione troppo -
DoSomeStuff(NewSubType s) {
s.someMethod();
}
e può anche incatenare/bolla in molti altri luoghi.
In termini di esempio di raccolta, questo consente di modificare l'implementazione dell'elenco a cui una variabile punta senza problemi. È possibile utilizzare facilmente un LinkedList
al posto di un ArrayList
.
Che cosa è con la fissazione sulla "performance"? Il 90% delle volte, si tratta dell'aspetto * meno importante * del codice di scrittura! –
http://stackoverflow.com/questions/383947/what-does-it-mean-to-program-to-an-interface – kiheru
Puoi anche dare un'occhiata a questo: http://stackoverflow.com/questions/ 17459553/why-do-some-people-use-the-list-base-class-to-instantiate-a-new-arraylist – Marc