Лично я бы пошел с первым. С последним скажем, что вы находитесь в такой ситуации, когда у вас есть куча производных классов:
class DerivedA : Implementation, IBar, IFoo { ... }
class DerivedB : Implementation, IBar, IFoo { ... }
class DerivedC : Implementation, IBar, IFoo { ... }
class DerivedD : Implementation, IBar, IFoo { ... }
И тогда ваши требования к Implementation
изменятся, так что теперь ему необходимо реализовать другой интерфейс, такой как IBaz
(что он может делать, не затрагивая ни один из производных классов, если он обеспечивает неабстрактную реализацию ) тогда у вас есть два варианта:
Оставьте все определения производных классов без явного объявления информации о новом интерфейсе, и в этом случае определение класса теперь неверно согласно стандарту и может ввести в заблуждение, если люди ожидают, что стандарт будет всегда соблюдаться.
Идите и найдите все производные классы и все их производные классы и исправьте объявления на них. Это требует времени, несколько подвержено ошибкам, и его трудно полностью выполнить, и превращает изменение одного файла в многофайловую регистрацию.
Ни один из этих вариантов не является привлекательным, поэтому я бы выбрал вариант, который не поставит вас в ту или иную ситуацию. Просто объявите самый производный интерфейс.