Чтобы понять интерфейсы в .net или Java, нужно сначала признать, что наследование объединяет две концепции:
- Реализации производного типа будут включать все поля (включая частные) базового типа,и может получить доступ ко всем открытым или защищенным элементам базового типа, как если бы он был его собственным.
- Объекты производного типа могут свободно использоваться вместо объектов базового типа.
Предоставление объектам возможности использовать элементы более чем одного базового типа в качестве собственного сложного.Некоторые языки предоставляют способы сделать это, но часто может возникнуть путаница относительно того, какая часть какого базового объекта упоминается, особенно если один наследует от двух классов, которые независимо наследуют от третьего.Следовательно, многие фреймворки позволяют объектам наследовать только от одного базового объекта.
С другой стороны, разрешение заменять объекты более чем одним другим типом объекта не создает этих трудностей.Объект, представляющий таблицу базы данных, может, например, позволить себе быть переданным подпрограмме, которая хочет «вещь, которая может перечислять содержимое, которое имеет тип T (IEnumerable in .net)», или подпрограмме, которая хочет«вещь, к которой могут быть добавлены вещи типа T» (ICollection в .net), или вещь, которая хочет «вещь, которая хочет знать, когда она больше не нужна (IDisposable в .net)».Обратите внимание, что есть некоторые вещи, которые требуют уведомления, когда они больше не нужны, которые не представляют перечислимые коллекции, и есть другие вещи, которые представляют перечисляемые коллекции, которые могут быть оставлены без уведомления.Таким образом, ни один тип объекта не может наследоваться от другого, но если один использует интерфейс для представления «вещей, которые могут перечислять свое содержимое, которые имеют тип T», или «вещей, которые хотят знать, когда они больше не нужны»,тогда нет проблем, если классы реализуют оба интерфейса.