Думайте об интерфейсах как о контрактах.
Вы создаете контракт, которому должен следовать класс. Например, если наш объект Dog должен иметь метод Walk, он определяет класс , должен реализовать этот метод.
Чтобы заставить каждый класс собак (унаследованный или нет) реализовать этот метод, вы должны заставить их придерживаться контракта, т.е. назначить интерфейс, который определяет этот метод.
Интерфейс - это конструкция, которая заставляет определенные классы следовать строгим правилам реализации.
Причина этого в том, что в итоге вы получаете объекты Dog (унаследованные или нет), которые теперь по умолчанию имеют метод Walk. Это означает, что вы можете передавать эти объекты как параметры, будучи уверенными в том, что вы можете вызывать метод Walk для любого класса Dog (унаследованного или нет), и он будет обязательно реализован.