module;
#include <iostream>
#include <string>
#include <string_view>

export module Artikel;

// Definition der Artikelklasse
export class Artikel
{
    // Da die Eigenschaften const sind, ist der
    // Zugriff darauf von abgeleiteten Klassen unkritisch
protected:
    const std::string     name;       // Name
    const unsigned long   nummer;     // Nummer
    inline static unsigned long anun{ 1 };   // Zaehler Artikelnummer
public:
    // Standard-ctor fuer Felddefinitionen
    Artikel() = default;
    // ctor, erhaelt Typ und Name und inkrementiert
    // die Artikelnummer
    Artikel(const char t, std::string_view n) : name(n), nummer(anun++)
    { }
    // virtueller dtor
    virtual ~Artikel() = default;
    // Pure virtual Methode zur Ausgabe Daten
    // Muss in allen abgeleiteten Klasse definiert sein
    virtual std::ostream& Print(std::ostream&) const = 0;
    // Operator << zur Datenausgabe
    friend std::ostream& operator << (std::ostream& out, const Artikel& obj);
};

// Der Operator << muss in der Basisklasse definiert werden da
// friend Funktionen nicht virtuell sein koennen
export std::ostream& operator << (std::ostream& out, const Artikel& obj)
{
    // Ruft virtuelle Methode der abgeleiteten Klasse auf
    return obj.Print(out);
}