module;
#include <print>

export module Graphics;

// Basisklasse für Grafikobjekte
// Diese Klasse muss mind. eine virtuelle Memberfunktion enthalten!
export class GBase
{
public:
    virtual void Draw() const = 0;
};

// Klasse für Kreise
export class Circle: public GBase
{
public:
    virtual void Draw() const
    {
        std::println("Kreis zeichnen");
    }
};

// Klasse für Rechtecke
export class Rect: public GBase
{
public:
    virtual void Draw() const
    {
        std::println("Rechteck zeichnen");
    }
};

// Klasse für Polygone
export class Polygon: public GBase
{
public:
    virtual void Draw() const
    {
        std::println("Polygon zeichnen");
    }
};

// Funktion zum zufaelligen Erstellen von Grafikobjekten
// (class factory)
export GBase* ClassFactory()
{
    GBase* ptr = nullptr;
    switch (std::rand() % 3)
    {
    case 0:
        ptr = new Circle;
        break;
    case 1:
        ptr = new Rect;
        break;
    case 2:
        ptr = new Polygon;
        break;
    }
    return ptr;
}