Интерфейс с точки зрения ООП - это просто контракт (договор, обязательство). Если класс наследует интерфейс, то он обязан его реализовать. Вот, собственно, и все
Абстрактные классы очень похожи на интерфейсы, но есть фундаментальные отличия, главное из которых - наследование от абстрактного класса встраивает ваш класс в дерево потомков абстрактного класса. В то же время интерфейс - это чистый контракт.
Из этого вытекает преимущество - класс может реализовать любое количество интерфейсов, в то время как унаследоваться можно только от одного абстрактного (есть языки, где можно наследоваться от нескольких абстрактных, но и там редко это делают)
Второе преимущество - это связанная с отсутствием иерархии наследования возможность без особых усилий подменять классы, которые реализуют интерфейсы, другими классами, которые реализуют те же интерфейсы. На этом основана концепция DI/IoC, плагинчики там всякие. Тот же LINQ - это возможность оперировать любыми коллекциями однообразно, неважно, какой класс лежит в основе коллекции - массив, список, словарь, множество и т.п. Это может быть и вообще не коллекция, а, скажем, генератор значений. Главное, что он поддерживает работу с собой как с коллекцией
Всегда есть возможность не использовать интерфейсы. Но ценой значительных трудозатрат и потери красоты решения. Так ведь и родились интерфейсы - как концептуальное решение
Интерфейс с точки зрения ООП - это просто контракт (договор, обязательство). Если класс наследует интерфейс, то он обязан его реализовать. Вот, собственно, и все
Абстрактные классы очень похожи на интерфейсы, но есть фундаментальные отличия, главное из которых - наследование от абстрактного класса встраивает ваш класс в дерево потомков абстрактного класса. В то же время интерфейс - это чистый контракт.
Из этого вытекает преимущество - класс может реализовать любое количество интерфейсов, в то время как унаследоваться можно только от одного абстрактного (есть языки, где можно наследоваться от нескольких абстрактных, но и там редко это делают)
Второе преимущество - это связанная с отсутствием иерархии наследования возможность без особых усилий подменять классы, которые реализуют интерфейсы, другими классами, которые реализуют те же интерфейсы. На этом основана концепция DI/IoC, плагинчики там всякие. Тот же LINQ - это возможность оперировать любыми коллекциями однообразно, неважно, какой класс лежит в основе коллекции - массив, список, словарь, множество и т.п. Это может быть и вообще не коллекция, а, скажем, генератор значений. Главное, что он поддерживает работу с собой как с коллекцией
Всегда есть возможность не использовать интерфейсы. Но ценой значительных трудозатрат и потери красоты решения. Так ведь и родились интерфейсы - как концептуальное решение
Комментарий недоступен