In most cases(I know of), interfaces with static or dynamic dispatch are used.
To illustrate this, here is bit of Java/C++ mix like pseudo code
Solution #1, using dynamic dispatch:
Code:
interface Renderer {
RenderThis()
RenderThat()
}
class RendererDirectX implements Renderer{
...
}
class RendererOpenGL implements Renderer{
...
}
if(options.renderer == "directx"){
renderer = new RendererDirectX();
}else{
renderer = new RendererOpenGL();
}
Solution #2, using static dispatch(which is more performant, but the destination needs to known at compile time):
Code:
class Renderer {
#ifdef PLATFORM_WII
Renderer rendererImpl = new RendererWii();
#else
Renderer rendererImpl = new RendererOpenGL();
#endif
RenderThis() {
rendererImpl.renderThis();
}
RenderThat() {
rendererImpl.renderThat();
}
}
If you are more familiar with C++, a interface is basically a class containing only pure virtual methods