Являются ли интерфейсы избыточными с множественным наследованием? - PullRequest
10 голосов
/ 02 декабря 2010

Это еще не вопрос о разнице между абстрактными классами и интерфейсами, поэтому дважды подумайте, прежде чем голосовать, чтобы закрыть его.

Я знаю, что интерфейсы необходимы в тех языках ООП, которые не поддерживаютмножественное наследование - например, C # и Java.Но как насчет тех с множественным наследованием?Будет ли концепция интерфейса (как особенность языка) излишней в языке с множественным наследованием?Я предполагаю, что ООП-контракт между классами может быть установлен с использованием абстрактных классов.

Или, если выразиться немного более явно, интерфейсы в C # и Java являются лишь следствием того факта, что они не поддерживают множественныенаследование?

Ответы [ 7 ]

8 голосов
/ 10 декабря 2010

Зависит от теста на избыточность.

Если тест «может ли эта задача быть выполнена без языковой функции», то сами классы являются избыточными, поскольку существуют конкурирующие языки Тьюринга без классов. Или из инженерной базы все, кроме машинного кода, является избыточным.

Реально, тест представляет собой более тонкую комбинацию синтаксиса и семантики. Что-то избыточно, если оно не улучшает ни синтаксис, ни семантику языка для разумного числа применений.

В языках, которые проводят различие, поддержка интерфейса объявляет, что класс знает, как общаться определенным образом. Наследование от другого класса импортирует (и, возможно, расширяет или модифицирует) функциональность другого класса.

Поскольку две задачи не являются логически эквивалентными, я утверждаю, что интерфейсы не являются избыточными. Различение между ними улучшает семантику для большого числа программ, поскольку оно может более конкретно указывать намерение программиста.

8 голосов
/ 02 декабря 2010

Совсем нет. Интерфейсы определяют контракты без указания реализаций.

Таким образом, они необходимы, даже если присутствует множественное наследование - наследование связано с реализацией.

Технически, вы можете использовать абстрактный класс в множественном наследовании для имитации интерфейса. Но при этом можно написать какую-то реализацию, которая создаст большие беспорядки.

7 голосов
/ 17 декабря 2010

... Отсутствие множественного наследования заставил нас добавить концепцию интерфейсы ...

Так что да, я считаю, что интерфейсы являются избыточными, учитывая множественное наследование. Вы можете использовать чисто абстрактные базовые классы на языке, поддерживающем множественное наследование или дополнения.

Тем не менее большую часть времени я вполне доволен единственным наследованием. Эрик Липперт ранее в том же томе (стр. 10) подчеркивает, что выбор единственного наследования "... одним махом устраняет многие сложные угловые случаи ..."

5 голосов
/ 16 декабря 2010

Существуют языки, поддерживающие множественное наследование, которые не включают в себя концепцию, параллельную интерфейсу Java.Эйфель является одним из них.Бертран Мейер не видел в них необходимости, поскольку была возможность определить отложенный класс (который большинство людей называют абстрактным классом) с конкретным контрактом.

Отсутствие множественного наследования может привести кв ситуациях, когда программисту необходимо создать служебный класс или тому подобное, чтобы предотвратить написание дублированного кода в объектах, реализующих один и тот же интерфейс.

Возможно, наличие контракта внесло существенный вклад в отсутствиеконцепция интерфейса, полностью свободная от реализации .... Контракты сложнее написать без каких-либо подробностей реализации, с которыми можно тестировать.

Таким образом, технически интерфейсы избыточны в языке, который поддерживает MI.

Но, как отмечали другие ... множественное наследование может быть очень сложной задачей, чтобы правильно использовать все время.Я знаю, что не мог ... и я работал на Мейера, когда он занимался разработкой объектно-ориентированного программного обеспечения, 2-е издание.

4 голосов
/ 12 декабря 2010

Являются ли интерфейсы в C # и Java лишь следствием того факта, что они не поддерживают множественное наследование?

Да, они есть.По крайней мере, на Java.Как простой язык, создатели Java хотели язык, который большинство разработчиков могли бы понять без обширного обучения.С этой целью они работали над тем, чтобы сделать язык максимально похожим на C ++ (знакомым), не перенося ненужной сложности C ++ (простой).Разработчики Java решили разрешить множественное наследование интерфейсов посредством использования интерфейсов - идея, заимствованная из протоколов Objective C. Подробнее см. Там

И, да, я считаю, что, как и в C ++, интерфейсы избыточны, если у вас множественное наследование.Если у вас есть более мощная функция, зачем оставлять меньше?

2 голосов
/ 10 декабря 2010

Что ж, если вы пойдете по этому пути, вы можете сказать, что C и C ++, C # и все другие языки высокого уровня избыточны, потому что вы можете кодировать все, что захотите, используя ассемблер.Конечно, вам абсолютно не нужны эти языки высокого уровня, однако, они помогают ... очень много.

Все эти языки поставляются с различными утилитами.Для некоторых из них концепция интерфейса является одной из этих утилит.Так что да, в C ++ вы могли бы избежать использования интерфейсов, флешки с абстрактными классами без реализации.

На самом деле, если вы хотите программировать Microsoft COM с C, хотя C не знает концепцию интерфейса, вы можете сделать это, потому что все .h файлы определяют интерфейсы следующим образом:

#if defined(__cplusplus) && !defined(CINTERFACE)
    MIDL_INTERFACE("ABCDE000-0000-0000-0000-000000000000")
    IMyInterface : public IUnknown
    {
   ...
    }
#else   /* C style interface */
    typedef struct IMyInterfaceVtbl
    {
        BEGIN_INTERFACE

        HRESULT ( STDMETHODCALLTYPE *SomMethod )(... ...);

        END_INTERFACE
    } IMyInterfaceVtbl;

    interface IMyInterface
    {
        CONST_VTBL struct IMyInterfaceVtbl *lpVtbl;
    };
#endif

Какой-то другой синтаксический сахар ...

И это правда, что в C #, если яне было концепции интерфейса, я не знаю, как я мог бы на самом деле код :).В C # нам абсолютно необходимы интерфейсы.

1 голос
/ 02 декабря 2010

Интерфейсы предпочтительнее множественного наследования, поскольку наследование нарушает инкапсуляцию в соответствии с пунктом 16 «Эффективной Java», Favor composition over inheritance.

...