Изучая ООП попытался реализовать фабричный метод.
Описание: В этом примере Фабричный метод помогает создавать кросс-платформенные элементы интерфейса, не привязывая основной код программы к конкретным классам элементов. Фабричный метод объявлен в классе диалогов. Его подклассы относятся к различным операционным системам. Благодаря фабричному методу, вам не нужно переписывать логику диалогов под каждую систему. Подклассы могут наследовать почти весь код из базового диалога, изменяя типы кнопок и других элементов, из которых базовый код строит окна графического пользовательского интерфейса.
Моя неудачная попытка реализации:
#include <iostream>
#include <string>
using namespace std;
class Button
{
public:
virtual void render();
virtual void onClick(string action);
};
class WindowsButton : public Button
{
public:
void render() override
{
cout << "Windows button rendering..." << endl;
}
void onClick(string action) override
{
cout << "> Windows button onClick event!" << endl;
cout << action << endl;
}
};
class HtmlButton : public Button
{
public:
void render() override
{
cout << "Html button rendering..." << endl;
}
void onClick(string action) override
{
cout << "> Html button onClick event!" << endl;
cout << action << endl;
}
};
class Dialog
{
public:
void render()
{
Button okButton = this->createButton();
okButton.onClick("Close Dialog");
okButton.render();
}
virtual Button createButton();
};
class WindowsDialog : public Dialog
{
public:
Button createButton() override
{
WindowsButton winButton;
return winButton;
}
};
class HtmlDialog : public Dialog
{
public:
Button createButton() override
{
HtmlButton htmlButton;
return htmlButton;
}
};
int main() {
int osType = 0; // 0 - Windows, 1 - Web
Dialog dialog;
if (osType == 0)
{
dialog = WindowsDialog();
}
else if (osType == 1)
{
dialog = HtmlDialog();
};
dialog.render();
}
Полученные ошибки:
Где я ошибся?
