В общем:
Интерфейсы должны быть использованы в любой ситуации, где важно то, что делает класс, не обязательно, что это такое. Класс, который может, например, создать собственную копию, может делать много других вещей, кроме того, но когда вы только заботитесь о возможности копирования объекта, вам остается только, чтобы объект реализовал ICloneable. Кроме того, интерфейсы полезны, когда реализация набора функций не используется; например, возможность вывода результатов вычисления может быть в виде файла, консоли или сети. Эти три реализации совершенно разные, но все они могут выглядеть одинаково для класса, которому нужен IOutputWriter.
Тезисы обычно используются для совместного использования кода. Абстрактный класс, в отличие от интерфейса, может определять логику метода, которую могут использовать его дети. BitmapImagePrinter работает конкретно с типом файла Bitmap, но ему нужна такая же логика, как JpegImagePrinter, чтобы фактически получить доступ к принтеру; так что эта логика может идти в AbstractImagePrinter. Тезисы также полезны, когда класс является более важным, чем то, что он делает. CheckingAccount и SavingsAccount являются BankAccounts, хотя они ведут себя по-разному.
Есть и другие особые случаи, когда вы ДОЛЖНЫ использовать тот или иной, но в целом это основное отличие.
дубликат http://stackoverflow.com/questions/761194/interface-vs-abstract-class-general-oo –