Реализация одной и той же сигнатуры метода из двух «интерфейсов» - PullRequest
15 голосов
/ 24 октября 2011

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

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

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

Ответы [ 2 ]

13 голосов
/ 24 октября 2011

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

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

Также, 2 других пункта из вашего вопроса

  1. наследование алмазов еще не произошло, потому что вы еще не упоминается любая общая база для Iaaa и Ibbb
  2. Вы не можете реализовать, 2 X::setVisible(bool) с такой же подписью
6 голосов
/ 24 октября 2011

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

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-интерфейса". C ++ полностью поддерживает реальные интерфейсы - более того, чем некоторые другие языки, которые иметь ключевое слово interface. Интерфейс определяет контракт; который, если язык не имеет специальной поддержки программирования по контракту, в большинстве случаев подразумевает конкретный код в интерфейсе, с виртуальным функции являются частными.)

...