Наследование означает, что вы наследуете характер (значение) и ответственность (поведение) родительского класса, тогда как реализация интерфейса означает, что вы выполняете контракт (например, Serializable), который может иметь не имеет ничего общего с основной природой или ответственностью класса.
Абстрактный класс позволяет вам определять природу, которую вы хотите, чтобы она была универсальной, а не напрямую инстанцируемой, потому что она должна быть специализированной. Вы знаете, как выполнять некоторые задачи высокого уровня (например, принимать решение в соответствии с некоторыми параметрами), но вы не знаете деталей для некоторых действий более низкого уровня (например, вычислять некоторые промежуточные параметры), потому что это зависит от выбора реализации. Альтернативой для решения этой проблемы является шаблон проектирования стратегии . Он более гибкий, допускает переключение стратегий во время выполнения и поведение Null, но при этом он более сложный (и переключение во время выполнения не всегда необходимо). Более того, вы можете потерять некоторые , что означает и средства ввода (полиморфизм и проверка типов становятся немного сложнее, потому что Стратегия - это компонент, а не сам объект).
Абстрактный класс = is-a, Стратегия = has-a
Редактировать: что касается множественного наследования, см. Ответ Pontus Gagge.