Virtuale e astratto sono quasi la stessa cosa. Un metodo virtuale ha un'implementazione nella classe base che può essere sovrascritta, mentre un metodo astratto non lo è e deve essere sovrascritto in una classe figlia. Altrimenti sono uguali. La scelta tra di loro dipende dalla situazione. Se hai un'implementazione di base, usi virtual. Se non lo fai, e hai bisogno di ogni discendente per implementarlo per se stesso, scegli l'astratto.
I metodi di interfaccia sono implementazioni di un metodo dichiarato in un'interfaccia implementata dalla classe. Questo è del tutto estraneo agli altri due. Penso che un metodo possa essere sia virtuale che interfaccia. Il vantaggio delle interfacce è che si dichiara un'interfaccia (duh) che può essere implementata da due classi totalmente diverse. In questo modo, puoi eseguire lo stesso codice su due classi diverse, a condizione che i metodi che desideri chiamare siano dichiarati nell'interfaccia che condividono.
@Downvoter: cosa c'è di sbagliato nella domanda? Non si dovrebbe fare questa domanda? – Nawaz