これらのそれぞれの長所と短所は何ですか?
いつ何を選ぶべきですか?この決定をするときに心に留めておくべき点は何ですか?
仮想と抽象はほぼ同じです。仮想メソッドは、基本クラスに実装があり、オプションでオーバーライドできますが、抽象メソッドは実装せず、子クラスでmustをオーバーライドできます。それ以外は同じです。それらのどちらを選択するかは、状況によって異なります。基本的な実装がある場合は、仮想を使用します。そうではなく、すべての子孫がそれを自分で実装する必要がある場合は、抽象を選択します。
インターフェイスメソッドは、クラスが実装するインターフェイスで宣言されているメソッドの実装です。これは他の2つとはまったく無関係です。メソッドは仮想とインターフェースの両方になり得ると思います。インターフェイスの利点は、2つのまったく異なるクラスで実装できる1つのインターフェイス(duh)を宣言することです。こうすることで、呼び出したいメソッドがそれらが共有するインターフェースで宣言されている限り、2つの異なるクラスで同じコードを実行できます。