Виртуальные и абстрактные почти одинаковы.Виртуальный метод имеет реализацию в базовом классе, которая может быть необязательно переопределена, в то время как абстрактный метод не имеет, и должен быть переопределен в дочернем классе.В остальном они одинаковые.Выбор между ними зависит от ситуации.Если у вас есть базовая реализация, вы используете виртуальную.Если это не так, и вам нужен каждый потомок, чтобы реализовать его для себя, вы выбираете абстрактный.
Методы интерфейса - это реализации метода, который объявлен в интерфейсе, который реализует класс.Это совершенно не связано с двумя другими.Я думаю, что метод может быть как виртуальным, так и интерфейсным.Преимущество интерфейсов состоит в том, что вы объявляете один интерфейс (duh), который может быть реализован двумя совершенно разными классами.Таким образом, вы можете запускать один и тот же код в двух разных классах, если методы, которые вы хотите вызывать, объявляются в интерфейсе, который они разделяют.