Я столкнулся с этой проблемой через коллегу сегодня. У него была конструкция для передней системы, которая выглядит следующим образом:
class LWindow
{
//Interface for common methods to Windows
};
class LListBox : public LWindow
{
//Do not override methods in LWindow.
//Interface for List specific stuff
}
class LComboBox : public LWindow{} //So on
Система Window должна работать на нескольких платформах. Предположим, что на данный момент мы нацелены на Windows и Linux. Для Windows у нас есть реализация для интерфейса в LWindow
. И у нас есть несколько реализаций для всех LListBox
es, LComboBox
es и т.д. Моя реакция состояла в том, чтобы передать LWindow*
(объект реализации) в базовый класс LWindow
, чтобы он мог это сделать:
void LWindow::Move(int x, int y)
{
p_Impl->Move(x, y); //Impl is an LWindow*
}
И, сделайте то же самое для реализации LListBox
и т.д.
Первоначально предложенное решение сильно отличалось. Это сводилось к следующему:
#define WindowsCommonImpl {//Set of overrides for LWindow methods}
class WinListBox : public LListBox
{
WindowsCommonImpl //The overrides for methods in LWindow will get pasted here.
//LListBox overrides
}
//So on
Теперь, прочитав все о макросах, являющихся злыми и хорошими проектами, я сразу же был против этой схемы. В конце концов, это дублирование кода. Но я не мог убедить своего коллегу в этом. И я был удивлен, что это так. Итак, я задаю вам этот вопрос. Каковы возможные проблемы последнего метода? Я бы хотел получить практические ответы. Мне нужно убедить кого-то, кто очень практичен (и привык делать такие вещи. Он упомянул, что в MFC много макросов!), Что это плохо (и я сам). Не научить его эстетике. Кроме того, что-то не так с тем, что я предложил? Если да, то как мне его улучшить? Спасибо.
РЕДАКТИРОВАТЬ: Пожалуйста, дайте мне несколько причин, поэтому я могу чувствовать себя хорошо о себе, поддерживая oop: (
Идти за щедростью. Пожалуйста, спросите, нужны ли вам какие-либо разъяснения. Я хочу знать аргументы для и против OOP против макроса:)