Подтвердить что ты не робот

Реализация одной и той же сигнатуры метода из двух "интерфейсов"

Используя чистые виртуальные методы для faux-интерфейсов в С++, что происходит, когда конкретный класс происходит от двух "интерфейсов", которые имеют идентичное объявление метода? например X подклассы Iaaa и Ibbb и реализует метод virtual void setVisible(bool);.

Имеет ли факт, что Iaaa и Ibbb не имеет тела метода, делает вещи проще/лучше, чем более классический сценарий наследования алмазов, и позволяет X::setVisible быть реализацией как для Iaaa::setVisible, так и Ibbb::setVisible?

Я полагаю, что более С++-способ формулировки вопроса "что происходит, когда один класс использует MI для вывода из 2-х классов, которые имеют идентичные подписи для чистого виртуального метода".

4b9b3361

Ответ 1

что происходит, когда один класс использует MI для вывода из 2 классов, которые имеют идентичные подписи для чистого виртуального метода

Поведение хорошо определено. Метод переопределения производного класса будет представлять собой реализацию обоих интерфейсов (т.е. Абстрактных class es со всеми чистыми функциями virtual).

Кроме того, еще 2 вопроса из вашего вопроса

  • Наследование алмазов еще не состоялось, потому что у вас нет упомянутая общая база для Iaaa и Ibbb
  • Вы не можете реализовать, 2 X::setVisible(bool) с той же подписью

Ответ 2

Это зависит. Если обе функции имеют одну и ту же подпись, и вы хотите замените их оба на одну и ту же функцию, затем просто сделайте это; Там есть не проблема, и ваша функция будет реализовывать их оба. Если они разные подписи, тогда вам понадобятся две разные функции: реализовать их. И если вам нужны разные реализации (вероятно, если интерфейсы не связаны), но они имеют одну и ту же подпись, то вам нужно будет ввести промежуточные классы, чтобы "переименовать" их, например:.

class MaskSetVisibleInAaa : public Aaa
{
    virtual void setVisibleInAaa( bool ) = 0;
    virtual void setVisible( bool newStatus )
    {
        setVisibleInAaa( newStatus );
    }
};

class MaskSetVisibleInBbb : public Bbb
{
    virtual void setVisibleInBbb( bool ) = 0;
    virtual void setVisible( bool newStatus )
    {
        setVisibleInBbb( newStatus );
    }
};

class ConcreteImplementation
    : public MaskSetVisibleInAaa
    , public MaskSetVisibleInBbb
{
    virtual void setVisibleInAaa( bool );
    virtual void setVisibleInBbb( bool );
};

(Я бы также поставил под вопрос использование вами "faux-интерфейса". С++ полностью поддерживает реальные интерфейсы, тем более, по сути, чем некоторые другие языки, которые имеют ключевое слово interface. Интерфейс определяет контракт; который, если язык не имеет специальной поддержки для программирования по контракту, подразумевает в большинстве случаев конкретный код в интерфейсе, с виртуальным функции являются частными.)