2013-03-28 1 views
2

Как следовать до this question: Если я создаю чистый виртуальный класс интерфейса и разделить реализующий класс в файл заголовка и источника, я получаю следующее:Интерфейсы C++: как избежать ввода одного и того же имени метода 3 раза?

Интерфейс:

class IDemo 
{ 
    public: 
     virtual ~IDemo() {} 
     virtual void OverrideMe() = 0; 
}; 

Реализация класса, заголовок:

class Child : public IDemo 
{ 
    public: 
     virtual void OverrideMe(); 
}; 

Реализация класса, источник:

void Child::OverrideMe() 
{ 
    //doStuff 
} 

Так что мне нужно tpye имя метода, объявленного в интерфейсе 3 раза, что не только громоздко, но и запутывает. Есть ли лучший способ сделать это?

+7

Нет, нет. И что это такое смущает? –

+0

Поскольку тот же метод объявлен в интерфейсе плюс файл заголовка. Если кто-то смотрит в заголовок, как он знает, что это объявление метода фактически унаследовано от базового класса? – mort

+0

Тип дважды, объединяя 2 и 3 вместе. –

ответ

4

Невозможно избежать этого (если вы не напишете определения в заголовочном файле, как уже указывали другие, так как Botz3000 также предложил - не делайте этого).

Это способ сделать это.


Я решил написать ответ, основанный на ваш комментарий:

меня:

И что это так запутано

вы:

Если кто-то смотрит в заголовок, как он знает, что этот метод декларации фактически унаследовал от базового класса

Ну, есть два пути - оставить комментарий, как:

/* 
* This overrides Base::OverrideMe 
*/ 
virtual void OverrideMe(); 

Большинство редакторов покажет вам этот комментарий, когда вы наведите курсор мыши на него.

Другой способ сделать это с помощью C++11, добавив ключевое слово override после функции:

class Child : public IDemo 
{ 
    public: 
     virtual void OverrideMe() override; 
}; 

Это может быть полезным для других случаев тоже.Вы можете увидеть this part of the wiki article about C++11: override

Смотрите также: Is the 'override' keyword just a check for a overridden virtual method?

+1

Мне очень нравится решение с использованием переопределения! – mort

2

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

Единственный способ уменьшить количество событий до двух - реализовать метод в заголовке класса, но я бы сильно отговорил это.

Смежные вопросы