Last active
December 23, 2015 06:29
-
-
Save berkus/6594822 to your computer and use it in GitHub Desktop.
Final version of the virtual classes gist, working.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
using namespace std; | |
class Button | |
{ | |
protected: | |
class Border { | |
public: | |
using Color = int; | |
virtual void draw() = 0; | |
Color getBaseColor(); | |
}; | |
class FlatBorder : public Border { | |
public: | |
void draw() override { | |
cout << "Button::FlatBorder::draw()" << endl; | |
} | |
}; | |
class PushedBorder : public Border { | |
public: | |
void draw() override { | |
cout << "Button::PushedBorder::draw()" << endl; | |
} | |
}; | |
// factories... | |
virtual unique_ptr<Border> createFlatBorder() { | |
return unique_ptr<Border>(new FlatBorder()); | |
} | |
virtual unique_ptr<Border> createPushedBorder() { | |
return unique_ptr<Border>(new PushedBorder()); | |
} | |
private: | |
unique_ptr<Border> border_; | |
void setBorder(unique_ptr<Border> border) { | |
border_ = std::move(border); | |
} | |
public: | |
void push() { | |
setBorder(createPushedBorder()); | |
} | |
void release() { | |
setBorder(createFlatBorder()); | |
} | |
void draw() { | |
border_->draw(); | |
} | |
}; | |
class MyButton : public Button | |
{ | |
class PushedBorder : public Border | |
{ | |
public: | |
void draw() override { | |
cout << "MyButton::PushedBorder::draw()" << endl; | |
} | |
}; | |
unique_ptr<Border> createPushedBorder() override { | |
return unique_ptr<Border>(new PushedBorder()); | |
} | |
}; | |
int main() | |
{ | |
MyButton button; | |
button.push(); | |
button.draw();// Does actually output MyButton::PushedBorder::draw() | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment